【发布时间】:2012-06-16 01:10:58
【问题描述】:
int i = 0, j = 0;
double nan1 = (double)0/0;
double nan2 = (double)0/0;
double nan3 = (double)i/j;
System.out.println(Double.doubleToRawLongBits(nan1) == Double.doubleToRawLongBits(nan2));
System.out.println(Double.doubleToRawLongBits(nan1) == Double.doubleToRawLongBits((double)0/0));
System.out.println(Double.doubleToRawLongBits(nan3) == Double.doubleToRawLongBits(nan2));
输出:
true
true
false
请帮助我如何输出前两个的true 和最后一个的false。请告诉我 Double.doubleToRawLongBits() 方法的实际工作是什么。
【问题讨论】:
-
正在生成两个不同的
NaNs。一个是0x7ff8000000000000,另一个是0xfff8000000000000。硬件似乎为0 / 0提供了0xfff8000000000000。但是编译器的不断传播是使用0x7ff8000000000000来代替。除非我忽略了什么,否则这对我来说就像一个错误。 -
如果为方法启用
strictfp会怎样? -
此外: »在符合 IEEE 754 标准的浮点存储格式中,NaN 由特定于 NaN 的预定义位模式标识。符号位无关紧要。« (Wikipedia)
-
你能澄清一下你对什么感到困惑吗?这是一个问题,为什么 NaN 可以有不同的位模式,或者为什么在涉及相同值的两种情况下产生的位模式不同?
-
@DanielPryden 我想你理解我真正的困惑。我的疑问是为什么第三个打印语句给出错误,尽管 nan3 和 nan2 都是使用相同的数字生成的,即通过执行 0/0。请回答我,我不明白已经给出的答案。
标签: java floating-point double nan