C标准库pow函数精度问题。

Posted VIPler

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C标准库pow函数精度问题。相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
int main ()
{
int temp,i;
double a=2.4568;
unsigned char b[5];
for(i=0;i<5;i++)
{
temp=(int)a; 
b[i]=temp+0;
a=(a-temp)*10;
printf("%f %d\n",a,(int)a);
}
b[5]=\0;
puts(b);
}

运行结果:

运行结果:
4.568000 4
5.680000 5
6.800000 6
8.000000 7
10.000000 9
24567
--------------------------------
Process exited with return value 0
Press any key to continue . . .
为什么最后的8.00000和10.00000被强制转换成7和9而不是8和10;

首先 float double这类的数据是近似值 有精度问题 这一点你知道吧

也就是说打印出来的8.0000 未必是8.00000

在你这个例子里面 

我改了一下 改为打印出20位小数:

#include <stdio.h>
int main ()
{
     int temp,i;
     double a=2.4568;
    unsigned char b[5];
 for(i=0;i<5;i++)
 {
         temp=(int)a;    
         b[i]=temp+0;
          a=(a-temp)*10;
          printf("%.20f %d\n",a,(int)a);
 }
         b[5]=\0;
         puts(b);
}

你再运行一下看看

可以发现8.00000实际上是7.99999999999872812850 所以会是转为int的7

一般来说 要把浮点转为int 要取得最近似的值 都是采用(int)(a+0.5) 从而达到一种四舍五入的效果

以上是关于C标准库pow函数精度问题。的主要内容,如果未能解决你的问题,请参考以下文章

函数

C语言,求高手分析双精度的输入,为啥定义一个双精度,输入函数中少了一个l,只用%f,可以执行,结果错误

求C语言标准函数库的源代码

[C/C++笔面试]不使用库函数将整数转换为字符串

[C/C++笔面试]不使用库函数将字符串转换为整数

二分快速幂