在C问题中的pow()函数

时间:2018-01-21 15:07:13

标签: c floating-point floating-accuracy pow

我在C中使用pow()函数时遇到一些问题。当运行此代码时,153作为输入,总和计算为152。但是,如果我不使用pow()函数而是使用for循环来获取 N n 的值,则总和计算为{{1 }}。任何人都可以帮忙解释一下这个区别吗?

153

1 个答案:

答案 0 :(得分:0)

您的C实现(包括其数学库)执行错误的pow会返回不准确的结果。 (当数学结果在浮点格式中完全可表示时,良好的pow实现会返回精确的结果。)例如,对于pow(7, 2),您的pow可能会稍微返回一个值当它转换为unsigned int时(除sum之外),它会被截断,结果为48。

要解决库中的此缺陷,请不要将pow用于整数运算。编写自己的整数运算来获得所需的结果。在某些情况下,使用round(pow(N, n))可能就足够了,但是需要考虑这个值的工作范围(宽整数可能表示double不能表示的整数),有时还有表现。 (另一种解决方法是获得更好的C实现。)