首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双值可以表示浮点可以表示的所有值吗?

双值可以表示浮点可以表示的所有值吗?
EN

Stack Overflow用户
提问于 2010-05-08 21:08:54
回答 6查看 6K关注 0票数 19

有一些浮点数不能表示的int值。

但是,双值可以表示浮点数可以表示的所有值吗?

我的直觉是肯定的,因为double有更多的小数位&更多的指数位,但可能有一些愚蠢的问题,我错过了。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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位短线。

票数 26
EN

Stack Overflow用户

发布于 2010-05-09 03:23:44

6.2.5/10在n1256中:

有三种真正的浮动类型,指定为浮动、双和长双。类型浮点的值集是类型double 的值集的子集;类型double的值集是long double类型的值集的子集。

(强调我的)。

无论实现是否使用IEEE754都是无关紧要的,C99标准可以保证您想要的东西。

票数 12
EN

Stack Overflow用户

发布于 2010-05-08 22:05:23

是的,双可以表示浮点可以表示的所有值。

原因如下:

这两个数字都表示为符号、指数和尾数。浮点和双面的区别是,指数和尾数有更多的空间。

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

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

1.99234

这个数字在小数点后面有5个小数位。如果你必须把同样的数字扩展到小数点10位,你会怎么做?简单:添加零:

1.9923400000

它是完全相同的数字,只是用更准确的尾数表示。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2795629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档