问题:JVM如何计算两个双精度NaN之和?
详细信息:IEEE 754规范为NaN保留了两个范围的位模式:
0x7ff0000000000001 -> 0x7fffffffffffffff
和
0xfff0000000000001 -> 0xffffffffffffffff.
IEEE 754要求两个NaN之和为NaN,但据我所知,它对实现细节一无所知。所以,要问我的问题:如果我们为NaN b(x)
的十六进制位模式写x
,我想知道:JVM如何从b(x + y)
和b(x)
的计算中计算b(y)?
加上一点点代码,我就可以相信:
Claim:设t = 0x0008000000000000
。如果b(y) + t
在有效的NaN范围内,则:
b(x + y) = b(y) + t
否则,
b(x + y) = b(y).
这对我来说似乎很奇怪,我想了解更多。作为记录,我在Intel i7 MacBook上使用Java 8(以防Java版本或物理硬件有问题。)以下是两个示例:
示例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如何评估总和吗?
谢谢!
对于浮点,大多数实现仅依赖底层硬件的功能。假设您正在某种x86架构上运行此代码,请遵循以下规则:(您可以在https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf的4.8.3.5节中找到此代码):