简单减法后得到错误的输出

问题描述 投票:0回答:1

如何使用下面的代码获得给定的输出?

#include <iostream>
#include <vector>
#include <future>
#include <algorithm>
#include <cmath>

using namespace std;

void solve() {
    int n = 1000000000;
    long long ans = n;
    ans = (ans * (ans + 1)) / 2;
    long i{0};

    while(true) {
        const auto num = pow(2, i++);
        if(num > n) {
            break;
        }
        cout << ans << " - " << (2 * num);
        ans -= 2 * num;
        cout << " = "<< ans << endl;
        if(i > 10){
            break;
        }
    }
}

int main() {
    solve();
    return 0;
}

输出:

500000000500000000 - 2 = 500000000500000000
500000000500000000 - 4 = 500000000500000000
500000000500000000 - 8 = 500000000500000000
500000000500000000 - 16 = 500000000500000000
500000000500000000 - 32 = 500000000500000000
500000000500000000 - 64 = 500000000499999936
500000000499999936 - 128 = 500000000499999808
500000000499999808 - 256 = 500000000499999552
500000000499999552 - 512 = 500000000499999040
500000000499999040 - 1024 = 500000000499998016
500000000499998016 - 2048 = 500000000499995968

我尝试使用以下逻辑从

ans
中减去所需的值:

int d = 1;
while(d <= n) {
    cout << res << " - " << d << endl;
    res -= 2 * d;
    d *= 2;
}

其中

res
与上面代码片段中的
ans
具有相同的值。

我哪里出错了?

c++ subtraction
1个回答
0
投票

A

double
可以完美地容纳任何整数,最大约为 2⁵³,约为 9 千万亿。这是 64 位双精度数的副作用,其小数部分只有 53 位。

高于该值开始达到极限,其中:

<very large double> + <small value> != <value you you think it should be>

所以一旦你得到大约 2⁵³,你就会看到

x + 1 == x
类型的怪异。 或者正如这里所讨论的:浮点似乎被破坏了

您在 500 千万亿及以上看到的奇怪数学与此一致。

© www.soinside.com 2019 - 2024. All rights reserved.