双精度浮点数的加法计算误差及其避免的初步方法

原创 2004年10月09日 11:22:00

双精度浮点数的加法计算误差及其避免的初步方法
我一开始是在mysql的sum函数中发现计算误差,经过分析,认为可能与双精度浮点数有关
#include <stdio.h>
main()
{
  char  str[256];
  double x=9999999999.00;
  double s=0.0;
  double x1=99999999.99;
  double s1=0.0;
  int i;

  for( i = 0; i < 8192; i++ ) {
    s += x;
  }
  printf( "%18.2lf", s );

  for( i=0;i<8192;i++)
  {
    s1 += x1;
  }
  printf("%18.2lf",s1);
  s1 = x1 * 8192.00;
  printf("%18.2lf/n",s1);

}
 

分别在Windows 和 unix 下边编译运行,得到的结果是相同的
81919999991808.00   819199999918.02 819199999918.08
这说明双精度浮点数的加法在小数点后边计算存在较大误差,而乘法就好一些
我初步想到了2种解决方法,不成熟,我也没有试过其他语言,请各位指正


解决方法一:
避免用double就没问题
比如在vb里面这么写,用Currency类型
Private Sub Command1_Click()
Dim i As Integer
Dim s As Double
Dim x As Double
Dim sc As Currency
Dim xc As Currency
x = 99999999.99
s = 0
For i = 1 To 8192
s = s + x
Next i
xc = 99999999.99
sc = 0
For i = 1 To 8192
sc = sc + xc
Next i
MsgBox s & " " & sc
End Sub
结果:819199999918.017 819199999918.08 

解决方法二:
加的时候不用小数点,加好以后再点
比如:
99999999.99连加的时候把小数点右移2位
用9999999999做连加,得出结果后再把小数点左移2位

程序员必知之浮点数运算原理详解

导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握。许多程序员都不清楚使用==操作符比较float/double类型的话到底出现什么问题。 许多人使用float/double进行货币计算时经常会...
  • tercel_zhang
  • tercel_zhang
  • 2016年09月14日 14:30
  • 19860

浮点数float累加误差解决方式总结

首先是float累加产生误差的原因,该部分转自:http://blog.csdn.net/zhrh0096/article/details/38589067 1.  浮点数IEEE 754表示方法...
  • wolf96
  • wolf96
  • 2017年07月10日 00:10
  • 1563

统计一下哪些数据库的sum函数有计算误差

方法:create table aa( id char(10),v decimal(18,2));insert into aa values(1,99999999.99);插入8192个相同的记录se...
  • l1t
  • l1t
  • 2004年10月13日 12:08
  • 2898

发现mysql 4.0.18 for nt 的sum函数的计算误差

发现mysql 4.0.18 for nt 的sum函数的计算误差mysql> create table ch3(ID char(32), V decimal(18,2));Query OK, 0 r...
  • l1t
  • l1t
  • 2004年10月01日 11:47
  • 2258

单精度浮点数(float)与双精度浮点数(double)的区别

【转载】 单精度浮点数(float)与双精度浮点数(double)的区别如下: (1)在内存中占有的字节数不同 •单精度浮点数在机内占4个字节 •双精度浮点数在机内占8个字节 (2)有效数字位...
  • qq_27183003
  • qq_27183003
  • 2015年10月30日 09:37
  • 14114

单精度浮点数(float)与双精度浮点数(double)的区别如下:

(1)在内存中占有的字节数不同 单精度浮点数在机内占4个字节 双精度浮点数在机内占8个字节 (2)有效数字位数不同 单精度浮点数有效数字8位 双精度浮点数有效数字...
  • nh5431313
  • nh5431313
  • 2017年05月18日 11:26
  • 275

浮点数(单精度、双精度数)的有效位

浮点数7位有效数字。 双精度数16位有效数字。 浮点数取值范围: 负数取值范围为 -3.4028235E+38 到 -1.401298E-45,正数取值范围为 1.401298E-45 到 ...
  • startwithdp
  • startwithdp
  • 2013年03月26日 13:54
  • 1761

汇编语言,双精度加法运算

要求计算X+Y=Z,将结果Z输出到屏幕上,其中X=001565A0H,Y=0021B79EH。实验利用累加器AX,先求低十六位和,并存入地址存储单元,后求高16位和,再存入高址存储单元。由于地位可能向...
  • jbx929205249
  • jbx929205249
  • 2011年10月25日 17:54
  • 4093

定点数、浮点数类型运算的说明

定点数、浮点数类型运算 处理器在进行数值运算的时候包括整数以及小数的运算: 处理器在操作小数的时候有两种表示方式:浮点运算和定点运算! 1.1定点数(fixed-point):字面意思看,小数点...
  • SYB773849846
  • SYB773849846
  • 2017年09月28日 14:16
  • 356

关于16进制字符串转为单精度浮点数和双精度浮点数的运算(二)

2.IEEE 64位浮点数格式 这种格式的特点是:每个数由8字节组成,包括1位符号位,11位带符号阶码,52位尾数。 例如:我们收到一个数的格式是 3F F0 6F 80 00 00 00 00,...
  • zhuyunfei
  • zhuyunfei
  • 2016年03月24日 17:37
  • 1188
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:双精度浮点数的加法计算误差及其避免的初步方法
举报原因:
原因补充:

(最多只允许输入30个字)