提问者:小点点

双数的表示


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


共1个答案

匿名用户

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

话虽如此,我的回答是:

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

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

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

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

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

0 0000000000000000000000000000000符号指数分数

对于指数,我们希望正指数和负指数都代表非常大和非常小的数字。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*1002*10-1
0.0147=0/10 1/100 4/1000 7/10000=0*10-11*10-24*10-37*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*1014*1002*10-15*10-2=3*10 4*1 2/10 5/100=137/4)
转换为二进制点:
100010.01(=1*250*240*230*221*210*20*2-11*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 1000010000010010000000000000000
不带行间距:
01000010000010010000000000000000

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

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

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

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

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

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