c - 为什么我的总和值比它应该的值低 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 是正确的。
解决方案
您的程序之所以成功152
,是sum
因为您的 C 实现具有低于标准的pow
.
的正确返回值为pow(5, 3)
125,但您的 C 实现返回类似于 124.9999999999999857891452847979962825775146484375 的值。在sum += pow(digit,3);
中,sum
有类型int
,所以加法的结果被转换为整数,导致小数部分被截断。
发生这种情况是因为pow
是使用浮点运算实现的,并且该实现不注意返回高质量的结果。pow
通常很难实现,但以pow
小于一个最小精度单位 (ULP) 的误差来实现是可行的。完成此操作后,在数学结果可表示的所有情况下都会返回完全正确的结果。
为避免在您的程序中出现这种情况,请不要使用浮点pow
函数。对于这个简单的程序,编写自己的“整数 pow”函数。
推荐阅读
- microservices - 用于 Spring 微服务集成的 Eureka 服务器和 Feign Client 在生产环境中是否可以在没有互联网的情况下工作?
- laravel - 如何在 laravel 中用 eloquent 做这个查询?
- salesforce - Salesforce - 在按钮单击时调用外部 API 并从响应中更新自定义字段
- html - 我可以将这样的动画添加到纯 CSS 中按钮的边框吗?
- java - RESTful Web 服务客户端 - 传递对象或仅传递对象的 id
- c++ - 尝试获取函数地址时出现错误 127
- wrapper - VEP 蛇形包装器的问题
- uitableview - Swift cellforrow 异步加载
- powershell - 捕获两个不同字符之间的文本。在第一个{和最后一个}之间
- python - MacOS 仍然指向 python3.6