为什么 pow 功能似乎出现故障?
why does the pow function seem to be glitching?
对于下面的代码:
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,b,c = 3,2,8
和i=19;
pow(19,3)
应该计算 19^3,但是当我用 (19x19x19) 替换 pow
时,这个特定情况得到满足,而 pow
函数则不是这样。
谁能解释一下问题出在哪里?
我的通灵能力表明您的标准库对 pow
的实现并不精确。我回想起前段时间关于 SO 的讨论。请记住,pow
returns 是一个浮点值。我无法重现它,但这完全可能是你调用了 pow(19,3)
returns 6858.999999999
或类似的,因为它的优化方式。
确实,这个 this page 说的也是:
Due to rounding errors in floating point numbers, the results of pow() may not be precise (even if you pass it integers or whole numbers).
此外,这个 question and answer 暗示了同样的事情。
我不会怀疑它,但你去吧。
考虑将此作为解决方法:
long long power = nearbyint(pow(i,a));
x = b * power + c;
对于下面的代码:
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,b,c = 3,2,8
和i=19;
pow(19,3)
应该计算 19^3,但是当我用 (19x19x19) 替换 pow
时,这个特定情况得到满足,而 pow
函数则不是这样。
谁能解释一下问题出在哪里?
我的通灵能力表明您的标准库对 pow
的实现并不精确。我回想起前段时间关于 SO 的讨论。请记住,pow
returns 是一个浮点值。我无法重现它,但这完全可能是你调用了 pow(19,3)
returns 6858.999999999
或类似的,因为它的优化方式。
确实,这个 this page 说的也是:
Due to rounding errors in floating point numbers, the results of pow() may not be precise (even if you pass it integers or whole numbers).
此外,这个 question and answer 暗示了同样的事情。
我不会怀疑它,但你去吧。
考虑将此作为解决方法:
long long power = nearbyint(pow(i,a));
x = b * power + c;