Java中的0.0和-0.0(IEEE 754)

Mag*_*ngr 6 java floating-point ieee-754

Java完全兼容IEEE 754吧?但我对java如何决定浮点加法和减法的符号感到困惑.

这是我的测试结果:

double a = -1.5;
double b = 0.0;
double c = -0.0;
System.out.println(b * a);  //-0.0
System.out.println(c * a);  //0.0
System.out.println(b + b);  //0.0
System.out.println(c + b);  //0.0
System.out.println(b + c);  //0.0
System.out.println(b - c);  //0.0
System.out.println(c - b);  //-0.0
System.out.println(c + c);  //-0.0
Run Code Online (Sandbox Code Playgroud)

我认为在乘法和除法中,符号决定如下:符号(a)xor符号(b),但我想知道为什么0.0 + -0.0 = 0.0,Java如何决定加法和减法的符号?它是在IEEE 754中描述的吗?

此外,我发现Java可以某种方式区分0.0和-0.0之间的相似性,因为

System.out.println(c == b);    //true
System.out.println(b == c);    //true
Run Code Online (Sandbox Code Playgroud)

java中的"=="如何工作?它被视为特例吗?

Den*_*ret 7

这里没有任何特定于Java的内容,它由IEEE754指定.

来自维基百科关于负零的文章:

根据IEEE 754标准,负零和正零应与通常(数字)比较运算符相比,如C和Java的==运算符.

所以以下数字相等:

(+0) - (-0) == +0
Run Code Online (Sandbox Code Playgroud)

在处理原始浮点数时,您将在所有现代语言中获得相同的行为.