在8位表示中,我们知道数字4存储为00000100,数字-4存储为11111100。但是数字4.6如何存储在double
中呢?
答案 0 :(得分:-1)
注意:这个问题可能更具体,是关于您是否想知道特定编程语言或系统使用哪种格式表示双精度型。这将有助于我缩小答案并丢弃不相关的细分。
话虽如此,这是我的答案:
您描述的表示4和-4的格式称为二进制补码。它允许最高位表示符号,这意味着负数和正数可以由组成数字表示形式的位表示。
浮点数通常以IEEE-754格式存储,与整数和其他“整数”格式不同。
该格式实质上将二进制表示形式分为三部分:符号,指数和分数。
符号是一位,代表正数(0)或负数(1)。另外两个的大小不同,但是如果您熟悉该系统,它与科学计数法非常相似。
假设我们已决定使用32位来表示小数。保留一位作为符号,因此我们有31位存储数字的实际值。
0 00000000 00000000000000000000000
Sign Exponent Fraction
对于指数,我们希望正和负指数都代表非常大和非常小的数字。 IEEE-754标准本可以使用您描述的熟悉的系统来存储这些指数,但是他们选择了其他系统。相反,我们确定一个 bias 为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
这里的趋势是,十进制数可以分解为其位数之和,再乘以用于写数字的基数的连续幂(当远离。时)。
< / p>
现在考虑这个数字:
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)符号 *(1+分数)* 2 指数-偏差
这种表示的一个好处是,也可以通过这些保留的指数表示无限和NaN(“非数字”)之类的东西。
您可以通过查看IEEE-754标准找到更多详细信息。
现实是,您可以按自己喜欢的方式存储它,因为这些位仅表示您决定它们对于程序的意义。但是存储它们的标准方法是IEEE-754标准。
标准表示法的缺点包括:
1.有损表示法
2.算术误差
3.有效地将可表示的指数范围与符号位一分为二,其他类型则通过有符号和无符号版本来避免这种情况。
因此,并不总是希望使用标准的二进制表示形式。