NaN的总和:如何计算基础位模式?

问题描述 投票:0回答:1

问题: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如何评估总和吗?

谢谢!

java math floating-point nan ieee-754
1个回答
0
投票

对于浮点,大多数实现仅依赖底层硬件的功能。假设您正在某种x86架构上运行此代码,请遵循以下规则:(您可以在https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf的4.8.3.5节中找到此代码):

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.