为什么 C++ 对 Just 17 DIGITS 给出错误答案?

Why C++ double giving wrong answer for Just 17 DIGITS?

最近在练习的时候发现了这个问题,请运行在你的本地机器上输入这个代码。

#include <bits/stdc++.h>
using namespace std;
double power(double a, double b) {
    double ans = 1;
    for(int i = 1; i <= b; i++){
        ans *= a;
    }
    return ans;
}

int main()
{
    double anaconda = 0;
    for(int i = 0; i < 25; i++){
        anaconda += power(10,i);
        cout << setprecision(30) << fixed <<i << " "<< anaconda << endl;
    }
}

如果你运行这个代码你应该看到这样的东西

你也可以在IDEONE中看到这段代码运行ning 你可以从 i = 16 看到,程序给出了错误的输出。 每个数字都应该是全1。 谁能告诉我

C++ 双精度类型通常以 64 位“双精度浮点”格式存储(在内存中)。

虽然这允许您表示和计算非常大和非常小的数字(相对于其他常见的 c++ 数据类型),但它仅以一定的 精度 来执行此操作。

这意味着您只能依赖 15-17 位数字。超出此范围的任何内容都是四舍五入到可以在特定内存量(同样,通常为 64 位)中表示的最接近值的结果。

我希望这能回答第一个问题。关于这一点还有很多需要了解,例如在这篇维基百科文章中:https://en.wikipedia.org/wiki/Double-precision_floating-point_format

至于第二个问题,答案是看情况。这仅取决于您要表示的数字有多大

例如,如果您只处理正整数,则可以通过切换到 unsigned long long int 来稍微扩展范围,这会让您达到 18,446,744,073,709,551,615(对于手头的代码来说还不够,所以我主要提到它是为了完整性)。

如果这还不够,您可能想寻找一个用于大数的 C++ 库。

Google c++ big number library and/or c++ big integer library.