浮点数累加的方法
来源:互联网 发布:弱视网络训练 编辑:程序博客网 时间:2024/04/28 21:50
运行下述代码段:
double value = 99999999.99;
double sum = 0.0;
for(int i=0;i<8192;i++)
{
sum += value; // 错误的浮点累加方法
}
printf("%18.2lf", sum); // 819199999918.02 --wrong
运行结果,sum是错误的, 和正确值相差0.06(99999999.99 * 8192 = 819199999918.08),对于报表之类的高精度的项目数据统计,这是不能容忍的,循环越多误差越大。解决方法之一,可以用高精度算法库来代替,比如doubledouble类型,或选择微软的解决方法:本意是,浮点相加硬件实现是减法。把加法改成减法,把误差也计算进去。
上述代码修改后:
double value = 99999999.99;
double sum = 0.0;
double C=0, Y, T;
for(int i=0;i<8192;i++)
{
Y = value - C;
T = sum + Y;
C = T - sum - Y; // 正确的浮点累加方法,做减法。
sum = T;
}
printf("%18.2lf", sum);// 819199999918.08 --correct
加了误差累计,这样结果就正确了。还有浮点运算法则最重要一点,是不符合实数算法相同的代数规则。 (sum+Y)-sum-Y ,结果是不等于零的。
参考:
http://msdn.microsoft.com/en-us/library/aa289157(VS.71).aspx
http://msdn.microsoft.com/en-us/library/aa289157(VS.71).aspx
http://www.cppblog.com/foxriver/archive/2009/02/28/75136.html
http://en.wikipedia.org/wiki/Compensated_summation
http://blog.csdn.net/l1t/article/details/122777
- 浮点数累加的方法
- 修正浮点数累加造成的误差
- 浮点数的表示方法
- 浮点数的表示方法
- 浮点数的表示方法
- 浮点数的表示方法
- 数的累加!
- IEEE754浮点数的转换方法
- [Java]IEEE754浮点数的转换方法
- 对浮点数四舍五入的方法
- 十进制浮点数的表示方法
- IEEE754浮点数的转换方法
- C# IEEE754浮点数的转换方法
- 判断浮点数溢出的方法
- IEEE754浮点数的转换方法
- 判断浮点数溢出的方法
- 浮点数的二进制表示方法
- 浮点数的表示与存储方法
- Qt学习——布局管理器QLayout类
- GetPixel SetPixel bitbil
- Makefile 入门
- 谈谈关于程序员或者IT人员的健康问题,因为自己出现了
- 开启第一步
- 浮点数累加的方法
- yaffs2源代码分析(一)
- Qt学习——基本对话框Q*Dialog类
- 《STL源码剖析》-- stl_slist.h
- 使用C#的HttpWebRequest模拟登陆访问人人网
- [usaco][舞会灯] party lamps
- 微软的宏图大志
- yaffs2源代码分析(二)
- STL中容器的几个容易混淆的成员函数-size, capacity, resize, reserve