JVMで0fと-0fの違い
scala> (0f) == (-0f) res0: Boolean = true scala> (-0f).hashCode res1: Int = -2147483648 scala> (0f).hashCode res2: Int = 0 うぇーい
2013-07-03 22:42:44あー、java.lang.Float.valueOf(x) でhashCode呼ぶ時はimplicitに変換されるけど==比較ではプリミティブ型のままだからか
2013-07-03 23:04:41java.lang.Floatの挙動は -0f!=0f で一貫してるしscala-library.jarの問題とも言いがたいけど合わせると気に食わないこの挙動はなに…
2013-07-03 23:06:52@k_matsuzaki わかりずらいですけど、java.lang.Floatが0fと-0fでequalにならない(つまりhashCode違ってもいい)のは、Java自体の仕様らしいので http://t.co/CBjbmTmLgC それで合ってるんですかね、たぶん・・・
2013-07-04 02:18:26http://t.co/CBjbmTmLgC 「この定義によって、ハッシュテーブルは正しく動作します。」のアルゴリズムの詳しい解説ってどこかないの?
2013-07-04 02:36:38@xuwei_k そうですね。java.lang.Floatには問題ありませんし、scalaのタプルもプラスマイナス区別せず比較とハッシュすると一貫してます。唯のFloatでボクシング起きるときが気持ち悪い…
2013-07-04 10:43:35う、でも Scala と Java で 0f と -0f を Map のkeyにした場合の挙動違う・・・ https://t.co/djdszstihL
2013-07-04 10:48:02@xuwei_k scalaはhashCode取らないんですね。Javaの場合、キーが実質的にjava.lang.Float.valueOf(0f).hashCode()となっているので、0fと-0fだとhashCodeが違うので別と認識されますよ。
2013-07-04 10:51:39.@BlackPrincessW hashCode取らないんじゃなくて、正確には java.lang.Float.valueOf(-0f).## は0だけど、java.lang.Float.valueOf(-0f).hashCode は-2147483648とかそのあたりの事情が
2013-07-04 10:54:35Set(Double.NaN, Double.NaN).size res0: Int = 2 new java.util.HashSet[Double]{add(Double.NaN);add(Double.NaN)}.size res1: Int = 1
2013-07-04 17:32:40