将真正大的int转换为double,从而在某些计算机上失去精度

时间:2018-09-25 05:37:20

标签: c++ types casting integer double

我目前正在使用cpp学习类型间数据转换。有人告诉我

  

对于一个非常大的整数,我们(对于某些计算机)可能会遭受   转换为双精度时的精度。

但是没有提供陈述的理由。

有人可以提供解释和示例吗?谢谢

2 个答案:

答案 0 :(得分:6)

如果int是64位并且double也是64位,则可能会发生这种情况。浮点数由尾数(代表数字)和指数组成。由于在这种情况下,double的尾数比int的位数少,因此double可以表示更少的数字,并且会造成精度损失。

答案 1 :(得分:3)

让我们说浮点数使用N位存储空间。

现在,让我们假设此浮点数可以精确表示可以用N位整数类型表示的所有整数。由于N位整数要求其所有N位都代表其所有值,因此对此浮点数也有要求。

浮点数应该能够代表小数。但是,由于所有位都用于表示整数,因此剩下的零位表示任何小数。这是一个矛盾,我们必须得出这样的结论,即float可以精确地表示所有整数,因为大小相等的整数类型必须是错误的。

由于必须存在N位整数范围内的不可表示的整数,因此,如果转换后的值恰好是非整数之一,则将该整数转换为N位浮点数可能会失去精度。可以代表的。


现在,由于浮点可以表示有理数的子集,因此那些可表示的值中的某些确实可以是整数。特别是,IEEE-754规范保证二进制双精度浮点数可以表示最大2 53 的所有整数。此属性与尾数的长度直接相关。

因此,在符合IEEE-754的系统上转换为双精度时,不可能丢失32位整数的精度。


从技术上讲,x86体系结构的浮点单元实际上使用80位扩展浮点格式,该格式被设计为能够精确表示所有64位整数,并且可以使用long double类型进行访问