当前位置:   article > 正文

[C/C++]C语言中math.h和cmath的pow()精度问题_c++和c的pow精度

c++和c的pow精度

帮小朋友们DEBUG的时候,他们有个题无论怎么提交OJ都不给过。

我回来后想了想,估计是因为math.h库返回值转int时精度丢失的问题。


>测试代码

  1. #include <stdio.h>
  2. #include <math.h>
  3. //MinGW GCC 4.7.2 32-bit Release
  4. int main(){
  5. printf("math.h - double pow(double, double) 精度测试\n");
  6. int a=3;
  7. printf("%d\n",(int)pow(5,3));//1.输出125
  8. printf("%d\n",(int)pow(5,a));//2.输出124 这里丢精度了,结合下面的[3],我估计最后的结果是float->int 124.999999999999
  9. printf("%d\n",(int)round(pow(5,a)));//3.输出125 在[2]的基础上补上round()四舍五入函数,结果正常
  10. printf("%lf\n",pow(5,a));//4.输出125.000000 显然,如果不转型成int,结果是没问题的
  11. return 0;
  12. }


>pow的精度问题研究

math.h库里,pow函数是基于浮点运算的。

试着找了一圈,没有找到源码,只在一些犄角旮旯里看到有人提到是在x86指令机上利用log和exp运算求出来的。也就是:

  1. double pow(double a, double b){
  2. //我这里简化了这个过程 大概写个伪码
  3. return x86_exp(a * x86_log(b));// 也就是:e^(a*ln(b))
  4. }
stackoverflow上也有关于这个问题的描述:

https://stackoverflow.com/questions/14104711/what-algorithm-is-used-to-pow-function-in-c

这个函数的具体实现过程则不得而知了。


上面那段代码玄学的地方是这两行:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/656828
推荐阅读
相关标签
  

闽ICP备14008679号