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