繁体   English   中英

以双格式存储的数字平方的差异

[英]Discrepancy in Squaring a number stored in double format

我正在尝试对数字 x 求平方,但在使用 Math.pow() 对其进行平方并使用乘法对其进行平方时,精度似乎存在一些差异。

public class MyClass {
    public static void main(String args[]) {
        long x = 1250075001;
        System.out.println(x*x);
        System.out.println(Math.pow((double)x,2.0));
    }
}

输出:

1562687508125150001
1.56268750812514995E18

偏差都是以粗体显示的结果

15626875081251 50001
1.5626875081251 4995 E18

我不是双重算术专家,也不是 Math.pow() 函数如何工作的专家。
我尝试阅读一些关于 IEEE 双标准和 Math.pow() 的在线文章,但没有帮助,这就是我来到 Stack Overflow 社区的原因。

数字1250075001作为double存储为(忽略符号)

Exponent   Mantissa (52 bits)
  +30      (1.)0010101000001010100001011110010000000000000000000000

请注意,这正好代表1250075001 ,因为这个整数仍然适合二进制形式的 53 位。

当您将此数字平方时,指数加倍为60 ,尾数平方变为(1.)010110101111110010000000001001011000101111010110101100110001 (60 位)。 由于尾数必须在 52 位以内,所以最后 8 位被截断。 因此,您会从真实结果中丢失00110001 2 = 49 ,即,您将得到 15626875081251 15626875081251 50001而不是15626875081251 49952 ,它存储为

Exponent   Mantissa (52 bits)
  +60      (1.)0101101011111100100000000010010110001011110101101011

你可以在这里玩二进制转换器/计算器,或者这里演示 IEEE 754 标准。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM