float vs double

float和double都可以表示浮点类型,但是它们可以表示的数据类型范围和精度是不同的。下面的代码便演示了这两种数据类型在一些场景下的差别。

 1  int a = 1219;
 2  int b = 56;
 3  __int64 c = 1503050028000;
 4  int d = 1000;
 5  float e = 0.883889;
 6 
 7 
 8  __int64 r1 = c + __int64((a - b))*d / e;
 9 
10  __int64 r2 = __int64((a - b))*d / e;
11 
12  __int64 r3 = c + r2;

 

 

这段代码运行后,结果是:

r1=1503051382784

r2=1315776

r3=1503051343776

这不科学,小学三年级的学生都知道这不对。

 

让我们来看看编译器是如何处理这段代码的吧。

 

执行完第8行代码前:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

执行完第8行代码后:

 

我们看到,编译器使用了CVTSD2SS指令将__int64类型转换为了float类型。正是这一转换过程,导致了精度的丢失。数值从原来的1503050028000变成了1503050152687.

 

最终的执行结果:

 

 

我们看到,不仅c的值发生了变化,__int64((a - b))*d=1163000的值也发生了变化。只是这个变化比较小,对最终的结果影响不大而已。

 

 

解决办法1:将float转换为double

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解决办法2:如同办法1,将算术运算分成多行,结果也正确。因为__int64并不会被转换为flloat从而丢失精度了。

 

所以,float和double的精度差别以及可表示的数值范围确实对数据的运算结果有着很大影响。

参考

https://stackoverflow.com/questions/5098558/float-vs-double-precision

 

转载于:https://www.cnblogs.com/songqiang/p/float_vs_double.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值