我目前正面临一个问题,但我不知道为什么会出错?
// 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;
with 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 个单位)
这可能是我电脑的问题,但也可能不是。谁能解释一下原因?
非常感谢!
答案 0 :(得分:2)
在许多 C++ 实现中,long long
类型是 64 位长,而 double
类型是 64 位长。发生这种情况时,double
类型的变量无法准确表示所有可能的 long long
值,特别是大 long long
值可能会被 double
错误地近似。
此处,round
将您的 long long
转换为 double
,从而引入了一些不精确性。