首页 > 解决方案 > 为什么我的总和值比它应该的值低 1?

问题描述

这是我的 C 代码,用于确定 153 等于每个数字的立方和。但是,为什么是 1 + 5^3 + 3^3 = 152 而不是 153?

#include <stdio.h>
#include <math.h>

int main()
{
 int digit, temp, sum = 0, num = 153;
 temp = num;
 while (num > 0)
 {
     digit = num % 10;
     sum += pow(digit,3);
     num /= 10;
 }
 printf("%d \n", sum);
 if (temp == sum)
 {
     printf("153 is a special number");
 }
 else
 {
     printf("153 is not a special number");
 }
}

编辑:我正在使用 CodeBlocks,我得到 152,而不是 153。但是,如果我使用 double sum 而不是 int sum,我会得到正确的答案。但我不确定为什么使用 double 是正确的。

标签: c

解决方案


您的程序之所以成功152,是sum因为您的 C 实现具有低于标准的pow.

的正确返回值为pow(5, 3)125,但您的 C 实现返回类似于 124.9999999999999857891452847979962825775146484375 的值。在sum += pow(digit,3);中,sum有类型int,所以加法的结果被转换为整数,导致小数部分被截断。

发生这种情况是因为pow是使用浮点运算实现的,并且该实现不注意返回高质量的结果。pow通常很难实现,但以pow小于一个最小精度单位 (ULP) 的误差来实现是可行的。完成此操作后,在数学结果可表示的所有情况下都会返回完全正确的结果。

为避免在您的程序中出现这种情况,请不要使用浮点pow函数。对于这个简单的程序,编写自己的“整数 pow”函数。


推荐阅读