0

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

4

1 回答 1

0

注意:这个问题可能更具体地涉及您是否想知道特定编程语言或系统使用什么格式来表示双精度数。这将帮助我缩小答案并丢弃不相关的部分。

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

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

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

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

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

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

0 00000000 00000000000000000000000 Sign Exponent Fraction

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

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

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

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

1.2 = 1 + 2/10 = 1*10 0 + 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*10 1 + 4*10 0 + 2*10 -1 + 5*10 -2 = 3 * 10 + 4 * 1 + 2 / 10 + 5 / 100 = 137/4)
转换为二进制点:
100010.01 (= 1 * 2 5 + 0 * 2 4 + 0*2 3 + 0*2 2 + 1*2 1 + 0*2 0 + 0*2 -1 + 1*2 -2 = 32 + 4 + 1/4 = 137/4)
转移到范围 [0,1):
1.0001001 * 2 5
这是将以我们的浮点格式存储的数字。

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

所以我们对 34.25 的完整浮点表示如下:
0 10000100 00010010000000000000000
没有空格:
01000010000010010000000000000000

因此,要提取我们的值,请执行以下操作:
(-1) sign * (1+fraction) * 2 exponent - bias

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

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

现实情况是,您可以以任何您喜欢的方式存储它,因为这些位仅表示您决定它们对您的程序的意义。但存储它们的标准方式是 IEEE-754 标准。

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

因此,使用标准二进制表示并不总是可取的。

于 2019-04-18T19:30:14.747 回答