我目前正在使用cpp学习类型间数据转换。有人告诉我
对于一个非常大的整数,我们(对于某些计算机)可能会遭受 转换为双精度时的精度。
但是没有提供陈述的理由。
有人可以提供解释和示例吗?谢谢
答案 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
类型进行访问