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

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位短路.

  • 问题只是关于将所有浮点数表示为双精度的能力.这是一个很长的说"是"的方式. (2认同)

Ste*_*sop 9

n1256中的6.2.5/10:

有三种实际浮动类型,分别为float,double和long double.float类型的值集是double类型的值集的子集 ; double类型的值集是long double类型的值集的子集.

(强调我的).

无论实现是否使用IEEE754都无关紧要,C99标准可以保证您的需求.


Nil*_*nck 7

是的,double可以表示浮点数的所有值.

原因如下:

两个数字都表示为符号,指数和尾数.float和double之间的区别在于,指数和尾数有更多的空间.

对于指数,更宽的范围是没有问题的.您可以使用int表示所有字节值,对于exponent也是如此.尾数有点不同,但如果你用零填充双尾数的额外位,你将得到与浮点数完全相同的值.

用十进制可能更容易理解:假设您有一个十进制数字,如下所示:

1.99234

此数字小数点后面有5位小数.如果你必须将相同的数字扩展到10位小数,你会怎么做?容易:添加零:

1.9923400000

它是完全相同的数字,只是在尾数中表示更准确.