赞
踩
帮小朋友们DEBUG的时候,他们有个题无论怎么提交OJ都不给过。
我回来后想了想,估计是因为math.h库返回值转int时精度丢失的问题。
>测试代码
- #include <stdio.h>
- #include <math.h>
- //MinGW GCC 4.7.2 32-bit Release
- int main(){
- printf("math.h - double pow(double, double) 精度测试\n");
-
- int a=3;
- printf("%d\n",(int)pow(5,3));//1.输出125
- printf("%d\n",(int)pow(5,a));//2.输出124 这里丢精度了,结合下面的[3],我估计最后的结果是float->int 124.999999999999
- printf("%d\n",(int)round(pow(5,a)));//3.输出125 在[2]的基础上补上round()四舍五入函数,结果正常
- printf("%lf\n",pow(5,a));//4.输出125.000000 显然,如果不转型成int,结果是没问题的
- return 0;
- }
>pow的精度问题研究
math.h库里,pow函数是基于浮点运算的。
试着找了一圈,没有找到源码,只在一些犄角旮旯里看到有人提到是在x86指令机上利用log和exp运算求出来的。也就是:
- double pow(double a, double b){
- //我这里简化了这个过程 大概写个伪码
- return x86_exp(a * x86_log(b));// 也就是:e^(a*ln(b))
- }
stackoverflow上也有关于这个问题的描述:
https://stackoverflow.com/questions/14104711/what-algorithm-is-used-to-pow-function-in-c
这个函数的具体实现过程则不得而知了。
上面那段代码玄学的地方是这两行:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。