首页 > 解决方案 > 在处理 C++ 中存储在双精度中的大整数时,如何避免舍入/精度错误?

问题描述

问题

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

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;
}

标签: c++precision

解决方案


根据WolframAlpha的结果2^1000

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

那永远不会适合 aint或 a double。您需要找到一个支持非常大数字的库。GNU 多精度算术库就是这样一个库。


推荐阅读