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 节中找到它):
问题: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 节中找到它):