1

我只有几行代码 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;

它返回 2 个不同的值:

    double * double =   10710528450172488
    long * long =       10710528450172489 

我无法理解发生了什么,我在 java 上遇到了这个错误,我也在 C++ 上尝试过,这就是问题所在。请帮助我(对不起我的英语不好)

4

3 回答 3

1

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

您的数字 10,710,528,450,172,489 有 17 位十进制数字,因此稍微超出了double.

在签名的 64 位系统中可以达到的最大数量long是 2^63 - 1 = 9,223,372,036,854,775,807,它大于您拥有的数量。

于 2016-03-30T07:56:03.393 回答
0

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

于 2016-03-30T07:46:03.850 回答
0

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

https://en.wikipedia.org/wiki/IEEE_floating_point

更准确地说,对于这个例子:https ://en.wikipedia.org/wiki/Double-precision_floating-point_format

于 2016-03-30T07:42:54.847 回答