为什么pow(10,2)99而不是100的结果?

Arl*_*lla -2 c

我正在用c制作一个新项目,功能"不起作用".我该怎么做才能解决?

它的功能实际为2到10的幂,但10的功率为1

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

int main(){
    int res=2;
    int base=10;
    int exp=2;
    res= pow(base,exp);
    printf("%d",res);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望输出为100,但输出为99

Eri*_*hil 5

pow(10, 2)产生一个略低于100的值,因为它是一个低质量的实现pow,并没有返回一个好的结果.

pow是一个难以实现的功能,并且所有商业实现产生许多在某种程度上不准确的结果.但是,良好的实现会努力使某些情况完全正确,包括结果恰好是整数的情况(或者,就此而言,是合理的).

pow(base, exp),如果exp在编译时已知为两个,则base*base应该使用它 - 它快速准确并且避免了pow问题.如果exp在编译时不知道是两个,则代码必须设计为容忍不准确pow或必须进行其他调整.(可以对有关情况或要求的更具体的问题提供进一步的建议.)

  • @ArlindiFrakulla:正如我的回答所述,可以对更具体的情况或要求的问题提供进一步的建议.如果已知`exp`为2,则使用`base*base`并且不要使用`pow`.如果不是这样,那么(a)您需要支持哪些案例?`base`总是一个整数?`exp`总是一个非负整数吗?(b)你为什么需要力量?它将使用什么进一步的算术 - 为什么它需要精确而不是近似?好的解决方案取决于具体要求.你必须写更多关于这种情况. (3认同)
  • 不,@ ArlindiFrakulla,转换到浮点和后退是让你陷入困境的原因.做更多这不是一个解决方案.FP算术和函数通常会产生*in*精确结果 - 有时候,就像你的情况一样,即使精确的数学结果是可表示的. (2认同)
  • @JohnBollinger:浮点数不是问题."pow"的执行不佳是个问题.如果你有一个整数`ipow(base,exponent)`,当确切的结果可以表示时给出了一个不准确的结果,你就不会说整数运算会让你遇到麻烦.你会说糟糕的软件让你陷入困境.这就是这里的情况:一个好的`pow`可以正常工作.一个糟糕的`pow`实现导致了这个问题. (2认同)
  • @JohnBollinger:在 Stack Overflow 问题中,我们不断重复整数算术失败——除法中缺少分数、溢出、类型问题——但很少有人将这些归咎于整数算术。大多数采取的方法是教人们正确使用整数算术。为什么浮点数的处理方式不同?这只是计算。学习使用它。 (2认同)