,关于c语言计算误差的有关问题

求助各位高手,关于c语言计算误差的问题
我只是在测试误差,代码如下:
#include <stdio.h>
void main()
{
int n = 100000000;
double sum = 0;
for( int i=0 ; i<n ; i++ )
sum = sum+0.0005;
printf("%lf\n",sum);
}
结果是50000.000013,为啥会有这么大的误差啊?
C 误差

------解决方案--------------------
你可以试试:
sum = sum + 0.00048828125 看看结果
------解决方案--------------------
引用:
0.00048828125 膜拜啊。 这都知道!!!


Quote: 引用:

你可以试试:
sum = sum + 0.00048828125 看看结果


很简单啊,1/2^n这样的小数是没有误差的(精度位数范围内)
------解决方案--------------------
引用:
Quote: 引用:

你可以试试:
sum = sum + 0.00048828125 看看结果

竟然没有误差。。。是不是0.0005在计算机内部用二进制存储的时候是无限小数,就省略了后面啊。。。
有没有什么方法可以避免这种误差啊?我不是很怕麻烦,有建议请告诉我


是的,转换为2进制后,是无限小数,超出位数部分,被抛弃,1/2^n这样的小数,只要在位数范围内,就不会有误差
------解决方案--------------------
转载的你看看
答:类似的问题经常见到有人问.我就来彻底回答:5.4+0.9怎么变成了6.300000000000001了?

5.4  (64位)
数学上表示:101.011 00110011 00110011 00110011 00110011 00110011 00110011 ............无限循环

计算机中IEEE表示:(2^2 * 1.X 形式)
0 10000000001 01 011 00110011 00110011 00110011 00110011 00110011 0011010(第一次不精确了,尾数1进入)

0.9 (64位)
数学上表示:0.111 00110011 00110011 00110011 00110011 00110011 00110011 00110011............无限循环

计算机中IEEE表示:(2^(-1) * 1.X 形式)
0 01111111110 11 001 10011001 10011001 10011001 10011001 10011001 10011010 (第二次不精确了,尾数1进入)

两者在计算中内部相加:

(1)0 10000000001  0101100110011001100110011001100110011001100110011010(5.4在计算机中IEEE表示)

(2)0 10000000001  0011100110011001100110011001100110011001100110011010