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

在帮助孩子们解决编程问题时,发现使用math.h库的pow()函数在将结果转换为整数时可能存在精度丢失。文章探讨了pow()函数的精度问题,通过测试代码和汇编对比,揭示了在不同情况下的表现,并指出可能与浮点运算的机器实现有关。
摘要由CSDN通过智能技术生成

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

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


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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值