double可以表示float可以表示的所有值吗?

时间:2010-05-08 21:08:55

标签: c floating-point int double

浮点数无法表示某些int值。

但是,double可以表示float可以表示的所有值吗?

我的直觉是肯定的,因为双倍有更多的小数位&更多的指数位,但可能会有一些我想念的愚蠢的陷阱。

6 个答案:

答案 0 :(得分:22)

了解浮动和双打的工作原理可能会有所帮助。

没有太多细节......

取数152853.5047(木星月亮的革命时期,以秒为单位)

在科学记数法中,这个数字是0.1528535047 × 10^6

由于计算机只能理解1和0,因此可以定义.

尾数(1528535047)和指数(6)存储在32位...如果我没记错的话,只有24位用于尾数,所以浮点通常更多的是精度而不是大小。数字越大,它就越不精确。

1528535047 = 1011011000110111001100000000111所以你只能存储前24位...最后三个1被砍掉。

由于整数是32位,你是对的,浮点不能准确地包含它。不太重要的数字会被淘汰出局。

可以存储绝对值小于2 ^ 24(24位)的任何整数而不会丢失精度。 (16777216)

这是位如何以浮点数存储:

How floats are stores diagram http://phimuemue.wordpress.com/files/2009/06/576px-ieee-754-single-svg1.png

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)