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



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

// 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,从而引入了一些不精确性。

最新更新