双数字的表示

问题描述 投票:0回答:1

在8位表示中,我们知道数字4存储为00000100,数字-4存储为11111100.但是数字4.6如何存储在double中?

floating-point double bit-representation
1个回答
-1
投票

注意:问题可能更具体地说明您是否想知道特定编程语言或系统用于表示双精度的格式。这将有助于我缩小答案范围并放弃不相关的细分。

话虽如此,这是我的答案:

您描述的用于表示4和-4的格式称为二进制补码。它允许最高位表示符号,这意味着负数和正数可以由构成数字表示的位表示。

浮点数通常以IEEE-754格式存储,格式与整数和其他“整数”的格式不同。

格式本质上将二进制表示分为三个段:符号,指数和分数。

符号有点,表示正(0)或负(1)。另外两个大小不一,但如果您熟悉该系统,它与科学记数法非常相似。

假设我们已经决定使用32位来表示小数。一位保留用于符号,因此我们有31位来存储该数字的实际值。

0 00000000 00000000000000000000000 Sign Exponent Fraction

对于指数,我们希望正指数和负指数都代表非常大且非常小的数字。 IEEE-754标准可能使用您描述的熟悉系统来存储这些指数,但他们选择了不同的系统。相反,我们确定偏差为2(指数段中的位数-1)-1。如果我在示例中使用8位作为指数段,则偏差为27-1或127。

所有1和所有0的指数都是保留的。因此,我们用这个系统代表的最高和最低指数分别是-126和127。

假设您要表示1.4 ^ 2。 2是你的指数。 我们的偏差是127,因此您将指数存储为2 + 127或129。

现在为分数。数字的小数部分必须严格大于或等于0且小于1.请坚持我,但考虑十进制数,以及它们如何工作。

1.2 = 1 + 2/10 = 1*100 + 2*10-1 0.0147 = 0/10 + 1/100 + 4/1000 + 7/10000 = 0*10-1 + 1*10-2 + 4*10-3 + 7*10-4

这里的趋势是十进制数可以被分解为其数字的总和乘以用于写入它的数字系统的基数的连续幂(当你离开。时)。

现在考虑这个数字: 0.01101 它以称为“二进制分数”的表示形式编写。以与以前大致相同的方式,这个数字可以写成一个总和,其中分母是2,基数的连续更高的幂,当我们离开这一点时:

0.01101 = 0/2 + 1/4 + 1/8 + 0/16 + 1/32 = 0*2-1 + 1*2-2 + 1*2-3 + 0*2-4 + 1*2-5

现在我已经描述了二进制点数如何工作,让我们在浮点数的表示中使用它们。

表示的小数部分将是您希望表示的任何值,作为二进制分数,移动到范围[0,1)。

例: 34.25(= 3 * 101 + 4 * 100 + 2 * 10-1 + 5 * 10-2 = 3 * 10 + 4 * 1 + 2/10 + 5/100 = 137/4) 转换为二进制点: 100010.01(= 1 * 25 + 0 * 24 + 0 * 23 + 0 * 22 + 1 * 21 + 0 * 20 + 0 * 2-1 + 1 * 2-2 = 32 + 4 + 1/4 = 137/4 ) 转移到范围[0,1): 1.0001001 * 25 这是将以我们的浮点格式存储的数字。

标志:0(正面) 指数:5 +偏差,127 = 132 = 10000100 分数:1.0001001 - 1 = .0001001(删除点,添加尾随零填充段)= 00010010000000000000000

所以34.25的完整浮点表示如下: 0 10000100 00010010000000000000000 没有间距: 01000010000010010000000000000000

因此,要提取我们的值,请执行以下操作: (-1)符号*(1 +分数)* 2exponent - 偏差

这种表示的好处是无穷大和NaN(“非数字”)之类的东西也可以通过那些保留的指数来表示。

您可以通过查看IEEE-754标准找到更多详细信息。

实际情况是,你可以以任何你喜欢的方式存储它,因为这些位只意味着你决定它们对你的程序意味着什么。但存储它们的标准方法是IEEE-754标准。

标准代表的缺点包括: 1.有损代表 2.算术不准确 3.使用符号位有效地将可表示的指数范围除以一半,其他类型通过有符号和无符号版本来避免这种情况)

因此,并不总是希望使用标准二进制表示。

© www.soinside.com 2019 - 2024. All rights reserved.