ano*_*non 14 c floating-point double int
浮点数无法表示某些int值.
但是,double可以表示float可以表示的所有值吗?
我的直觉说是的,因为double有更多的小数位和更多的指数位,但可能会有一些我遗漏的愚蠢的陷阱.
Arm*_*est 22
它可能有助于了解浮动和双打的工作原理.
没有太多细节......
拿数字152853.5047(木星的月亮Io的革命时期在几秒钟内)
在科学记数法中,这个数字是 0.1528535047 × 10^6
由于计算机只能理解1和0,因此可以定义 .
尾数(1528535047)和指数(6)存储在32位内......如果我没记错的话,只有24位用于尾数,因此浮点通常更多的是精度而不是大小.数字越大,它就越不精确.
1528535047 = 1011011000110111001100000000111所以你只能存储前24位...最后三个1被砍掉了.
由于整数是32位,你是对的,浮点不能准确地包含它.不太重要的数字会被淘汰出局.
可以存储绝对值小于2 ^ 24(24位)的任何整数而不会丢失精度.(16777216)
这是位以浮点数存储的方式:
如何浮动商店图http://phimuemue.wordpress.com/files/2009/06/576px-ieee-754-single-svg1.png
源 符号一位,指数为8位,尾数为23位.因此,要回答您的问题,由于只为尾数保留了23位,因此无法精确显示32位整数.由于需要显示更多数字,它将迅速开始删除数字(从右侧).
对于double,你只是增加它可以存储的位数...实际上,它被称为双精度,因此任何可以显示为float的数字都能够显示为double.额外的0只是添加到尾数.
因此,由于double占用64位,因此大多数人在从32位int转换为double时会使用double.浮点适合转换16位短路.
n1256中的6.2.5/10:
有三种实际浮动类型,分别为float,double和long double.float类型的值集是double类型的值集的子集 ; double类型的值集是long double类型的值集的子集.
(强调我的).
无论实现是否使用IEEE754都无关紧要,C99标准可以保证您的需求.
是的,double可以表示浮点数的所有值.
原因如下:
两个数字都表示为符号,指数和尾数.float和double之间的区别在于,指数和尾数有更多的空间.
对于指数,更宽的范围是没有问题的.您可以使用int表示所有字节值,对于exponent也是如此.尾数有点不同,但如果你用零填充双尾数的额外位,你将得到与浮点数完全相同的值.
用十进制可能更容易理解:假设您有一个十进制数字,如下所示:
1.99234
此数字小数点后面有5位小数.如果你必须将相同的数字扩展到10位小数,你会怎么做?容易:添加零:
1.9923400000
它是完全相同的数字,只是在尾数中表示更准确.