NaN 的总和:底层位模式是如何计算的?

The sum of NaNs: How is the underlying bit pattern calculated?

问题:JVM如何计算两个双精度NaN的和?

详情:IEEE 754 规范为 NaN 保留了两个范围的位模式:

0x7ff0000000000001 -> 0x7fffffffffffffff

0xfff0000000000001 -> 0xffffffffffffffff.

IEEE 754 要求两个 NaN 的总和为 NaN,但据我所知,它对实现细节保持沉默。所以,回到我的问题:如果我们为 NaN x 的十六进制位模式编写 b(x),我想知道:JVM 如何从 [= 计算 b(x + y) 16=] 和 b(y)? 玩了一点代码,我相信:

认领:让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 节中找到它):