在C ++中处理存储在double中的大整数时,如何避免舍入/精度错误?

时间:2019-02-26 22:52:24

标签: c++ precision

问题

我正在尝试解决以下问题:

  

2 ^ 15 = 32768,其位数之和为3 + 2 + 7 + 6 + 8 = 26。

     

数字2 ^ 1000的位数之和是什么?

Source

由于精度错误,我一直得到错误的输出。但是,正如您在下面看到的那样,我尝试确保所有内容都不会四舍五入,也不会因为精度而丢失。我编写的代码比期望的输出(1366)少两个(1364)。如何优化我的代码,以免由于精度和舍入错误而丢失其他内容?

我的代码

#include <iostream>
#include <tgmath.h>
#include <string>
using namespace std;

int main() {
    int sum=0;
    double N = pow(2.0, 1000.0);
    string num = to_string(N);
    for(int i=0; i<num.size(); i++) {
        sum += num[i] - '0';
    }
    cout<<sum;
    return 0;
}

1 个答案:

答案 0 :(得分:1)

根据WolframAlpha2^1000的结果为

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

那将永远不会适合intdouble。您需要找到一个支持大量数字的库。 The GNU Multiple Precision Arithmetic Library是这样的图书馆之一。