使用double时精度损失

Loss of precision while working with double

本文关键字:损失 精度 double 使用      更新时间:2023-10-16

我们能处理10^308以内的大数吗?如何用双精度来计算11的105次方?

式(11^105)的答案为:22193813979407164354224423199022080924541468040973950575246733562521125229836087036788826138225193142654907051

有可能得到11^105的正确结果吗?据我所知double可以处理10^308比11^105大得多。我知道这段代码是错误的:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
    double n, p, x;
    cin >> n >> p;
    //scanf("%lf %lf", &n,&p);
    x = exp(log((double)n)*p);
    //printf("%lfn", x);
    cout  << x <<endl;
    return 0;
}

谢谢。

double通常有11bit的exp(-1022~1023归一化),52bit的fact和1bit的sign。因此,不能准确地表示11^105。

更多说明,参见Wikipedia上的IEEE 754

Double可以保存非常大的结果,但精度不高。与定点数相比,double是浮点实数。这意味着,对于相同的精度,double可以移动基数来处理不同的数字范围,从而您看到高范围。

对于您的目的,您需要一些自制的大型库,或者您可以找到一个现成的并且由其他人编写的库。

顺便说一句,我的家常菜给出了不同的答案11105用这个haskell代码确认