浮点数无法表示某些int值。
但是,double可以表示float可以表示的所有值吗?
我的直觉是肯定的,因为双倍有更多的小数位&更多的指数位,但可能会有一些我想念的愚蠢的陷阱。
答案 0 :(得分:22)
了解浮动和双打的工作原理可能会有所帮助。
没有太多细节......
取数152853.5047
(木星月亮的革命时期,以秒为单位)
在科学记数法中,这个数字是0.1528535047 × 10^6
由于计算机只能理解1和0,因此可以定义.
尾数(1528535047)和指数(6)存储在32位...如果我没记错的话,只有24位用于尾数,所以浮点通常更多的是精度而不是大小。数字越大,它就越不精确。
1528535047 = 1011011000110111001100000000111
所以你只能存储前24位...最后三个1被砍掉。
由于整数是32位,你是对的,浮点不能准确地包含它。不太重要的数字会被淘汰出局。
可以存储绝对值小于2 ^ 24(24位)的任何整数而不会丢失精度。 (16777216)
这是位如何以浮点数存储:
source 符号一位,指数为8位,尾数为23位。因此,要回答您的问题,由于只为尾数保留了23位,因此无法精确显示32位整数。由于需要显示更多数字,它将很快开始削减数字(从右侧开始)。
对于double,你只是增加它可以存储的位数...事实上,它被称为双精度所以任何可以显示为float的数字都能够显示为双。额外的0只是添加到尾数。
由于这个原因,由于double占用了64位,因此大多数人在从32位int转换为double时会使用double。浮点数可以很好地转换16位短。
答案 1 :(得分:9)
6.25 / 10在n1256:
有三种真正的浮动类型, 指定为float,double和long 双。 的一组值 type float是set的子集 double类型的值;这一组 double类型的值是一个子集 long类型的值集合 双
(强调我的)。
实施是否使用IEEE754无关紧要,C99标准可以保证您的需求。
答案 2 :(得分:7)
是的,double可以代表浮点数的所有值。
原因如下:
两个数字都表示为符号,指数和尾数。 float和double之间的区别在于,指数和尾数有更多的空间。
对于指数,更宽的范围是没有问题的。您可以使用int表示所有字节值,对于exponent也是如此。尾数有点不同,但如果你用零填充双尾数的额外位,你将得到与完全相同的值。
可能更容易理解为十进制:假设您有一个十进制数字,如下所示:
1.99234
此数字小数点后面有5位小数。如果你必须将相同的数字扩展到10位小数,你会怎么做?简单:添加零:
1.9923400000
它是完全相同的数字,只是在尾数中表示更准确。
答案 3 :(得分:1)
任何float
号都可以表示为double
。我不确定NaNs。 (我确信你可以通过在有效数字上添加额外的零来表示float
NaN为double
,但我不确定对NaN作出反应的软件或硬件是否会对这样的NaN做出反应完全相同的方式。)
答案 4 :(得分:0)
在实践中,是的。但是,我怀疑标准是否需要它。如果具有64位int
的平台(当前64位平台上的AFAIK int
实际上是32位,但long
为64),则会显示double
这也是64位,那么一些int
值将无法表示为double
值。
答案 5 :(得分:0)