在与C 双打中存储的大整数时,如何避免舍入/精确错误

How to avoid rounding/precision errors when dealing with big integers stored in doubles in C++?

本文关键字:何避免 舍入 错误 整数 存储 在与      更新时间:2023-10-16

问题

我正在尝试解决以下内容:

2^15 = 32768,其数字的总和为3 2 7 6 8 = 26。

数字2^1000的数字之和是多少?

来源

由于精确错误,我不断获得错误的输出。但是,正如您在下面看到的那样,我试图确保没有任何圆形或因精确度而丢失。我写的代码落在所需的输出(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;
}

根据wolframalpha, 2^1000的结果是

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

永远不会适合intdouble。您需要找到一个支持大量数字的库。GNU多重精度算术库是一个这样的库。