1樓:
hash的本質是對二進位制串進行操作,只要有一位不同hash結果就差千萬里。
那麼,你的問題就是先把相近的值用相同的二進位制串表達,然後去計算hash。
具體怎麼定義相近,就由你自己實現。最簡單的辦法就是用吧。
這裡的公式編輯器不支援分數麼?
2樓:
如何保證被看做相等的兩個數值非常接近的浮點數hash到相同的值?
=> 先定義什麼是數值非常接近?有多接近?
思路是1)根據「數值非常接近」的定義,將浮點數對映成byte序列,這裡會有浮點數的精度損失。
2)然後用通用的方法將1)中byte序列進行hash。
計算機中表示的浮點數在數軸上不是均勻的,「數值非常接近」的定義本質上是將數軸劃分成乙個乙個的格仔,屬於同乙個格仔的全部浮點數都可以對映為格仔的序號,進而進行hash。
3樓:
如何保證被看做相等的兩個數值非常接近的浮點數hash到相同的值?
這個取決於你判定相等的條件。
如果採用一般形式的fabs(a - b) < EPSILON來判等的話,可以考慮將數值乘以1.0 / EPSILON取整。
如果採用fabs(a / b - 1) < EPSILON(其中b != 0)來判等的話,可以直接用IEEE中關於浮點數的格式說明來設計演算法。一般來說,指數字要全部計算,尾數字按精度取,符號位特殊處理(要考慮+-0的情況)。
但是需要注意的是,無論你用什麼方法,都不能保證當判定條件成立時,兩個數一定有相同的hash值。hash的相等關係不滿足傳遞性,對於不同的數,必然會由於截斷而不一致的的判定半徑。
這點對於整數也是一樣的。
浮點數如何轉換為定點數?
Aman 按 IEEE754 標準,float 的格式是 binary32,double 的格式是 binary64,浮點數中的有效數字 significant 部分其實可以理解為是乙個定點數,只不過有指數 exponent 部分做了小數點偏移 類似科學計數法,只不過是二進位制的,浮點數因此得名 我...
浮點數不能表示的最小正整數是?
春日的憂鬱 首先浮點數呈離散分布,且其步長為2 e 2 n 此公式證明可參照此問題下另一位答主的數學推導 取實際階碼值 階碼用移碼表出 e n,步長為1,此時最大可表達的值為11 11B 由於隱藏位,共n 1個1 算出2 n 1 1,此時從2 n到2 n 1 1之間的正整數都能精確表達。實際上通過改...
如何用 C 語言生成 2,2 之間的隨機浮點數?
把區間 a,b 上的點r線性對映到區間 x,y 用公式 b r y x b a x即可。c語言裡面a 0,b RAND MAX,有的語言a 0,b 1。 Milo Yip 通常是這樣寫 include srand rand RAND MAX include printf include time i...