使用双精度时精度损失

时间:2014-05-12 09:13:46

标签: c++ floating-point

我们能否使用最多10 ^ 308的大数字。 如何使用双倍计算11 ^ 105?

  

(11 ^ 105)的答案是:   22193813979407164354224423199022080924541468040973950575246733562521125229836087036788826138225193142654907051

是否有可能获得11 ^ 105的正确结果? 据我所知,双倍可以处理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("%lf\n", x);
    cout  << x <<endl;
    return 0;
}

感谢。

2 个答案:

答案 0 :(得分:5)

double通常有11位表示exp(-1022~1023标准化),52位表示事实,1位表示符号。因此,11 ^ 105无法准确表示。

有关详细说明,请参阅IEEE 754 on Wikipedia

答案 1 :(得分:2)

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

为了您的目的,您需要一些自制的大型图书馆,或者您可以找到其他人随时可用的书籍。

BTW my home cooked recipe对11 105 给出了不同的答案 已确认此haskell code