为什么 round() 使我的表达式给出错误答案?

时间:2021-06-16 15:57:36

标签: c++

我目前正面临一个问题,但我不知道为什么会出错?

// 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 个单位)

这可能是我电脑的问题,但也可能不是。谁能解释一下原因?

非常感谢!

1 个答案:

答案 0 :(得分:2)

在许多 C++ 实现中,long long 类型是 64 位长,而 double 类型是 64 位长。发生这种情况时,double 类型的变量无法准确表示所有可能的 long long 值,特别是大 long long 值可能会被 double 错误地近似。

此处,round 将您的 long long 转换为 double,从而引入了一些不精确性。