解析长和双

Parse Long and Double

本文关键字:      更新时间:2023-10-16

我只有下面几行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 = tt"<<temp2;

它返回两个不同的值:

    double * double =   10710528450172488
    long * long =       10710528450172489 

我不明白发生了什么,我在java上有这个错误,我也在C++上尝试过,这就是问题所在。请帮我(对不起我英语不好)

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

您的数字10710528450172489有17位小数,因此略微超出了double的精度。

在64位系统上的带符号long中可以达到的最大数量为2^63-1=9223372036854775807,这比您的数字要大。

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

请参阅https://en.wikipedia.org/wiki/IEEE_floating_point

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

由于数字在内部的存储方式,双精度有一定的不精确性。当你用替身做数学运算时,这种不精确性可能会加剧。如果您的代码需要能够处理小数位数,而这是一个不可接受的错误数量,请考虑使用允许较大小数位数的库。如果re的所有可能值都是整数,那么长版本应该可以正常工作。

相关文章:
  • 没有找到相关文章