为什么 pow 函数似乎出现故障?

问题描述

对于以下代码:

int digsum(ll num) {  //function to calculate sum of digits
    if (num < 0)
        num = abs(num);
    int ans = 0;
    while (num != 0) {
        ans = ans + num % 10;
        num = num / 10;
    }
    return ans;
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);

    int a,b,c,cnt = 0;
    long long x;
    cin >> a >> b >> c;

    for (int i = 0; i <= 72; i++) {
        x = (b * (pow(i,a))) + c;
        if (i == digsum(x) && x < mod) {
            cout << x << " ";
        }
    }

    return 0;
}

分别在a,c = 3,2,8i=19;的情况下 pow(19,3) 应该计算 19^3 但是当我用 (19x19x19) 替换 pow 时,这个特定情况得到了满足,而 pow 函数不是这种情况。 有人能解释一下是什么问题吗?

解决方法

我的超能力表明您的标准库对 pow 的实现并不精确。我记得不久前关于这个主题的讨论。请记住,pow 返回一个浮点值。我无法重现它,但由于它的优化方式,这完全有可能是您对 pow(19,3) 的调用返回 6858.999999999 或类似的。

确实,这 this page 说明了很多:

由于浮点数的舍入错误,pow() 的结果可能不精确(即使您传递的是整数或整数)。

此外,这个 question and answer 暗示了同样的事情。

我不会怀疑它,但你去了。

考虑将此作为一种解决方法:

long long power = nearbyint(pow(i,a));
x = b * power + c;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...