关于浮点数(实数)运算精度

计算机内部如果并不是所有的浮点数运算都能准确的计算结果,如果再设计程序的时候没有注意到精度问题,将酿苦果,如下算式
y = a + b - c
赋值如下
float a=200 000 000;
float c=200 000 000;
float b=2;
计算机运算后额结果是0.
WHY ??
主要是没有准确了解计算机内部对于浮点数的计算原理,如下:
“在加减浮点数时,将会调整指数。 因此在加减过程中,基数和指数将保持不变,仅增加尾数。”
也就是在运算前,先将两个变量调整为指数一致的数值,运算仅将尾数相加减,所以在上面的算式中运算的第一步就粗错了
a+b: 在指数调整后,两个操作数(a = 2.000000E8 和 b = 2.000000E0)的 结果值如下所示:

a = 1.000000E8 且 b = 0.00000001E8。 第二个数字(操作数 b)的最后两位数将被截断(由于16位精度的float仅6 位小数的精度),因为 6 位小数的精度无法再表示这个数。 因此,该操作数将会加 0,而不是加 1。进而导致第二次计算时,结果为零
调整方案:

  1. y=a-c+b.原因自己分下,和之前不同的是,此算式先计算a-c
  2. 将abc三个变量定义为double(LReal)类型,此数据类型是以 15 位小数的精度进行处理,因此不会产生上述问题。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值