C++中while循环用pow()计算数字立方和为何出错?
为什么用
pow()计算立方和会出错? 你踩的这个坑其实挺常见的——pow()是针对浮点数设计的数学函数,存在精度误差,这就是导致输入153时输出152的核心原因。
具体原因拆解:
pow()函数返回的是double类型的浮点数,而浮点数在计算机里是用二进制近似表示的。比如计算pow(5, 3)时,底层运算可能得到的不是精确的125,而是一个非常接近125但略小于它的值(比如124.99999999999999)。当你把这个浮点数加到int类型的sum里时,会自动触发截断取整——直接丢掉小数部分,结果就变成了124。
那153的各位立方和本来是:
1³ + 5³ + 3³ = 1 + 125 + 27 = 153
但因为5的立方被错误地取整为124,总和就变成了1 + 124 + 27 = 152,正好和你看到的错误结果一致。
正确的写法:用整数乘法代替pow()
对于整数的整数次幂,完全不需要用浮点函数,直接用整数乘法既高效又精确。修改后的代码如下:
int number; int sum = 0; std::cin >> number; while(number > 0) { int digit = number % 10; // 先取出当前位的数字 sum += digit * digit * digit; // 用整数乘法计算立方 number /= 10; } std::cout << sum << std::endl; return 0;
这样计算时,所有运算都是整数类型的精确运算,不会有任何精度损失,输入153就能得到正确的153了。
内容的提问来源于stack exchange,提问作者Phurinat Puekkham
相关产品推荐
相关产品推荐

