質問:どのようにJVMが2倍精度のNaNの合計を計算していますか?
詳細:IEEE 754仕様準備のNaNのビットパターンを2つの範囲:
0x7ff0000000000001 -> 0x7fffffffffffffff
そして
0xfff0000000000001 -> 0xffffffffffffffff.
IEEE 754私の知る限り、実装の詳細に沈黙している、NaNにする2つのNaNの合計を必要としますが、。だから、私の質問に到達するために:私たちが書く場合b(x)
はNaNを16進数のビットパターンのためにx
、私が知りたいのです:どのようにJVMの計算がないb(x + y)
からb(x)
とb(y)?
コードの少しと遊ぶ、私は信じるにつながりますよ。
クレーム:みましょうt = 0x0008000000000000
。場合はb(y) + t
、その後、有効なNaNの範囲です。
b(x + y) = b(y) + t
さもないと、
b(x + y) = b(y).
これは私には奇妙に思える、と私はより多くを知っているように思います。記録のために、私は(場合にはJavaバージョンまたは物理的なハードウェアの問題を。)インテルi7のMacBookの上でJava 8を使用しています。ここの二つの例は以下のとおりです。
実施例1、ここで b(x + y) = b(y):
b(x) = 0x7fffddee0f43e7d4
b(y) = 0xfffaeaba08397e4e
b(x + y) = 0xfffaeaba08397e4e
(実施例2)、ここで b(x + y) = b(y) + t:
b(x) = 0xffff4f0202031106
b(y) = 0xfff79342c97104ff
b(x + y) = 0xffff9342c97104ff
合計はJVMによって評価されているか誰でも知っていますか?
ありがとう!
浮動小数点の場合、ほとんどの実装は、単純に、基盤となるハードウェアが何をするかに依存しています。here'reルール、あなたはx86アーキテクチャのいくつかの並べ替えでこれを実行していると仮定すると:(あなたがのセクション4.8.3.5でこれを見つけることができますhttps://software.intel.com/sites/default/files/managed/39 /c5/325462-sdm-vol-1-2abcd-3abcd.pdf):