解析Long和Double 我只不过有几行代码C++: long re = 103491683; double temp = (double)re * (double)re; cout<<"\n"<<"double * double = \t"<<(long)temp; long temp2 = re * re; cout<<"\n"<<"long * long = \t\t"<<temp2; 我无法理解发生了什么,我在java上有这个bug,我也尝试C++,这就是问题所在。请帮帮我(抱歉我的英语不好)

解析Long和Double 我只不过有几行代码C++: long re = 103491683; double temp = (double)re * (double)re; cout<<"\n"<<"double * double = \t"<<(long)temp; long temp2 = re * re; cout<<"\n"<<"long * long = \t\t"<<temp2; 我无法理解发生了什么,我在java上有这个bug,我也尝试C++,这就是问题所在。请帮帮我(抱歉我的英语不好),c++,parsing,long-double,C++,Parsing,Long Double,双精度类型的精度为52位二进制位,其他位用于存储指数,另一位用于存储符号。long类型(在大多数64位系统上)具有63位精度,其中一位用于存储符号。在double*double计算中,您丢失了最低有效位 看 更准确地说,对于这个例子:由于数字是如何在内部存储的,所以double具有一定的不精确性。当你用双精度进行数学运算时,这种不精确性会变得更加复杂。如果你的代码需要处理小数点,这是一个不可接受的错误量,考虑使用一个允许较大的十进制数的库。如果re的所有可能值总是整数,那么长版本应该可以正常工作

双精度类型的精度为52位二进制位,其他位用于存储指数,另一位用于存储符号。
long
类型(在大多数64位系统上)具有63位精度,其中一位用于存储符号。在
double*double
计算中,您丢失了最低有效位


更准确地说,对于这个例子:

由于数字是如何在内部存储的,所以double具有一定的不精确性。当你用双精度进行数学运算时,这种不精确性会变得更加复杂。如果你的代码需要处理小数点,这是一个不可接受的错误量,考虑使用一个允许较大的十进制数的库。如果
re
的所有可能值总是整数,那么长版本应该可以正常工作。

A
double
数字具有64位存储。其中,1用于存储符号,11用于存储指数,53用于存储十进制数字。这意味着您可以达到的数字最大精度为15.95位小数53*log10(2)

您的号码10710528450172489有17位十进制数字,因此稍微超出了
双精度
所能达到的精度

在64位系统上,有符号
long
中可以达到的最大数目为2^63-1= 9223372036854775807,大于您的数字。

解析在哪里?,
    double * double =   10710528450172488
    long * long =       10710528450172489