如何使用下面的代码获得给定的输出?
#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
具有相同的值。
我哪里出错了?
A
double
可以完美地容纳任何整数,最大约为 2⁵³,约为 9 千万亿。这是 64 位双精度数的副作用,其小数部分只有 53 位。
高于该值开始达到极限,其中:
<very large double> + <small value> != <value you you think it should be>
所以一旦你得到大约 2⁵³,你就会看到
x + 1 == x
类型的怪异。 或者正如这里所讨论的:浮点似乎被破坏了。
您在 500 千万亿及以上看到的奇怪数学与此一致。