Cha*_*har 14 java floating-point double nan
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));
Run Code Online (Sandbox Code Playgroud)
输出:
true
true
false
Run Code Online (Sandbox Code Playgroud)
请帮助我输出true前两个和false最后一个的输出.请告诉我Double.doubleToRawLongBits()方法的实际工作是什么.
请尝试运行以下代码来查看这些值:
public class Test
{
public static void main(String[] args){
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) + " is " +
(Double.doubleToRawLongBits(nan1) == Double.doubleToRawLongBits(nan2)));
System.out.println(Double.doubleToRawLongBits(nan1) + " == "+ Double.doubleToRawLongBits((double)0/0) + " is " +
(Double.doubleToRawLongBits(nan1) == Double.doubleToRawLongBits((double)0/0)));
System.out.println(Double.doubleToRawLongBits(nan3) + " == "+ Double.doubleToRawLongBits(nan2) + " is " +
(Double.doubleToRawLongBits(nan3) == Double.doubleToRawLongBits(nan2)));
}
}
Run Code Online (Sandbox Code Playgroud)
在我的 Mac 上,它会产生以下输出:
9221120237041090560 == 9221120237041090560 is true
9221120237041090560 == 9221120237041090560 is true
-2251799813685248 == 9221120237041090560 is false
Run Code Online (Sandbox Code Playgroud)
doubleToRawLongBits 方法的 Javadoc 中记录了此陷阱:
如果参数为 NaN,则结果是表示实际 NaN 值的长整数。与 doubleToLongBits 方法不同,doubleToRawLongBits 不会将所有将 NaN 编码为单个“规范”NaN 值的位模式。
| 归档时间: |
|
| 查看次数: |
638 次 |
| 最近记录: |