2017-08-11 3 views
0

最初はバグだと思っていましたが、ソースコードを見れば明らかに意図的です。誰がなぜこれが行われているのか知っていますか?それはClojureとバグの微妙な原因とは矛盾しています。ClojureScriptはintとしてハッシュされています

(hash 1) ; => 1 
(hash 1.5) ; => 1 

https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/core.cljs#L985

(defn hash 
    "Returns the hash code of its argument. Note this is the hash code 
    consistent with =." 
    [o] 
    (cond 
    (implements? IHash o) 
    (bit-xor (-hash ^not-native o) 0) 

    (number? o) 
    (if (js/isFinite o) 
     (js-mod (Math/floor o) 2147483647) 
     (case o 
     Infinity 
     2146435072 
     -Infinity 
     -1048576 
     2146959360)) 
    ...)) 

答えて

1

JavaScriptが一つだけの数の種類があります:64-bit float between -(2^53)-1 and (2^53)-1を。しかし、bitwise operations work on 32-bit signed integers。浮動小数点数がビットごとの演算子で動作するハッシュに変換されるとき、損失のある変換が必要です。​​のモジュロ演算用のマジックナンバー2147483647は、32ビット符号付き数で表現可能な最大整数です。値Infinity-Infinityの特別な処理もあります。

関連する問題