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

帮小朋友们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

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


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

  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值