我目前面临一个问题,但我不知道为什么会出错?
// ll ís long long
ll cnt = 24822089714520516;
cout << "xpow: " << xpow(10LL, 16) << endl;
cout << "cnt: " << cnt << endl;
ll a = xpow(10LL, 16) + cnt - 1;
ll b = round(xpow(10LL, 16)) + cnt - 1;
cout << "cur_num (without round): " << a << endl;
cout << "cur_num (with round): " << b << endl;
其中xpow
由我自己定义:
ll xpow(ll a, ll b) {
ll ans = 1;
while (b) {
if (b & 1)
ans *= a;
b >>= 1;
if (b)
a *= a;
};
return ans;
};
当我运行代码时,我会得到以下日志:
xpow: 10000000000000000
cnt: 24822089714520516
cur_num (without round): 34822089714520515
cur_num (with round): 34822089714520516
正如你所看到的,如果我使用舍入,我的结果与不使用舍入(小于1个单位(时的结果不同
这可能是我电脑的问题,但可能不是。有人能解释为什么吗?
非常感谢!
在许多C++实现中,long long
类型的长度为64位,而double
类型的长度则为64位。当这种情况发生时,类型为double
的变量不能准确地表示所有可能的long long
值,特别是大的long long
值可能被double
错误地近似。
这里,round
将您的long long
转换为double
,从而引入了一些不精确性。