有一些浮点数不能表示的int值。
但是,双值可以表示浮点数可以表示的所有值吗?
我的直觉是肯定的,因为double有更多的小数位&更多的指数位,但可能有一些愚蠢的问题,我错过了。
发布于 2010-05-08 21:55:51
是。
它可能有助于了解浮动和双倍的工作方式。
没有过多的细节..。
以数字152853.5047为例(以秒为单位计算木星月亮的旋转周期)。
在科学表示法中,这个数字是0.1528535047 × 10^6。
由于计算机只理解1和0,所以可以定义.。
尾数(1528535047)和指数(6)存储在32位内.如果我没记错的话,尾数只有24位,所以浮点通常更多的是关于精度而不是大小。数字越大,它的精确度就越低。
1528535047 = 1011011000110111001100000000111所以你只能存储前24位.最后的三个一个被砍掉了。
因为整数是32位,你说得对,浮点不能准确地包含它.不太重要的数字会从末端被砍掉。
任何绝对值小于2^24 (24位)的整数都可以存储,而不会丢失精度。(16,777,216)
这些位是如何存储在浮点数中的:
浮点数是如何存储关系图http://phimuemue.wordpress.com/files/2009/06/576px-ieee-754-single-svg1.png
来源符号为1位,指数为8位,尾数为23位.因此,为了回答您的问题,因为只有23位是为尾数保留的,所以32位整数无法精确显示。它将迅速开始删除数字(从右边),因为有更多的数字需要显示。
对于双倍来说,你只是在增加它可以存储的位数.事实上,它被称为双精度,因此任何可以显示为浮点数的数字都可以显示为双精度。额外的0只是添加到尾数。
因此,由于一个双比特占用64位,所以大多数人在从32位int转换为double时都会使用double。浮子可以很好地转换16位短线。
发布于 2010-05-09 03:23:44
6.2.5/10在n1256中:
有三种真正的浮动类型,指定为浮动、双和长双。类型浮点的值集是类型double 的值集的子集;类型double的值集是long double类型的值集的子集。
(强调我的)。
无论实现是否使用IEEE754都是无关紧要的,C99标准可以保证您想要的东西。
发布于 2010-05-08 22:05:23
是的,双可以表示浮点可以表示的所有值。
原因如下:
这两个数字都表示为符号、指数和尾数。浮点和双面的区别是,指数和尾数有更多的空间。
对于指数来说,更宽的范围是没有问题的。您可以用int表示所有字节值,指数也是如此。尾数有点不同,但是如果用零填充双尾数的额外位,则得到与浮点数完全相同的值。
在十进制中可能更容易理解:假设您有一个十进制数字,如下所示:
1.99234
这个数字在小数点后面有5个小数位。如果你必须把同样的数字扩展到小数点10位,你会怎么做?简单:添加零:
1.9923400000
它是完全相同的数字,只是用更准确的尾数表示。
https://stackoverflow.com/questions/2795629
复制相似问题