使用 IEEE 754 将浮点数转换为二进制
Floating point to binary using IEEE 754
您好,我需要使用 IEEE 格式存储 0.2730。现在我所做的是将 sing 设置为 0,因为数字是正数。现在我认为,既然点之前的是 0,那么我不必对其进行任何转换,因为 0 在二进制中只是 0,所以指数最终会是 0,我只需要将 127 转换为二进制。当我寻找尾数时,当我将小数部分乘以 2 并取出之前的数字时,我尝试做模式我找不到模式也没有达到 0 所以我所做的只是乘以直到找到 23 位.现在,当我查找实际值时,它说指数应该是 125,而这个数字实际上是 0 0111 0001 0111 1000 1101 0101 000。现在我不知道为什么我必须从指数中减去 2,因为我认为我在乘以 2 模式时不必移动点或何时停止。我留下了一张我工作的照片以防有帮助。提前致谢,希望你一切顺利
很难看清图片中的内容,但这是您的号码的二进制布局 0.2730
,既有单精度也有双精度 IEEE-754 表示形式。希望您可以使用它来仔细检查您的答案。如果您有不匹配的地方,请随时提出更具体的问题。
这是单精度(32 位)IEEE-754 表示形式的 0.2730
:
3 2 1 0
1 09876543 21098765432109876543210
S ---E8--- ----------F23----------
Binary: 0 01111101 00010111100011010101000
Hex: 3E8B C6A8
Precision: SP
Sign: Positive
Exponent: -2 (Stored: 125, Bias: 127)
Hex-float: +0x1.178d5p-2
Value: +0.273 (NORMAL)
同样,这次是双精度(64 位)IEEE754 表示:
6 5 4 3 2 1 0
3 21098765432 1098765432109876543210987654321098765432109876543210
S ----E11---- ------------------------F52-------------------------
Binary: 0 01111111101 0001011110001101010011111101111100111011011001000110
Hex: 3FD1 78D4 FDF3 B646
Precision: DP
Sign: Positive
Exponent: -2 (Stored: 1021, Bias: 1023)
Hex-float: +0x1.178d4fdf3b646p-2
Value: +0.273 (NORMAL)
IEEE-754 binary32 编码
0.2730的符号为正,所以IEEE-754 binary32格式的符号位为0
接下来,用 2 的幂显式缩放表示数字:0.2730 = 0.2730 • 20。其中,“•”(0.2730)之前的部分我们称其为有效位,2的次方为指数。
然后,调整此表示法,使尾数至少为 1 且小于 2。允许的调整是以 1 为增量调整指数,并相应地将尾数乘以或除以 2:0.2730 • 20 = 0.5460 • 2−1 = = 1.0920 • 2−2.
这称为规范化形式。这种形式的指数 -2 用于编码。为了在指数位中对其进行编码,我们添加了格式的固定偏差 127,并将结果写入 8 位二进制。 −2 + 127 = 125, 125二进制为01111101.
接下来,将有效数写入二进制至少24位:1.0920 = 1.0001011110001101010011111101111100111011…2。粗体显示前 24 位数字。我们只能使用 IEEE-754 binary32 格式的 24 位,我们看到剩下的部分在第 24th 位的一半以上,所以我们将四舍五入,得到 1.000101111000110101010002。那是我们的二进制有效数字。 (有关执行此操作的信息,请参阅下面的“十进制到二进制”。)
为了对有效数字进行编码,我们使用“.”之后的 23 位数字。 (已知前导数字为 1,因为我们将数字标准化以使其成为 1,因此它不需要包含在主要编码有效数字的位中。)这些位是 00010111100011010101000。
然后我们将符号位、指数位和有效位放在一起:0 01111101 00010111100011010101000。
十进制转二进制
十进制数1.0920转二进制:
- 写入前导“1”并将其删除,得到 .0920。乘以二,得到 0.1840。还要写“.”因为我们从这里开始。
- 写入前导“0”并将其删除,得到 .1840。乘以二,得到 0.3680.
- 写入前导“0”并将其删除,得到 .3680。乘以二,得到 0.7360.
- 写入前导“0”并将其删除,得到 .7360。乘以二,得到 1.4720.
- 写入前导“1”并将其删除,得到 .4720。乘以二,得到 0.9440.
根据需要继续。
您好,我需要使用 IEEE 格式存储 0.2730。现在我所做的是将 sing 设置为 0,因为数字是正数。现在我认为,既然点之前的是 0,那么我不必对其进行任何转换,因为 0 在二进制中只是 0,所以指数最终会是 0,我只需要将 127 转换为二进制。当我寻找尾数时,当我将小数部分乘以 2 并取出之前的数字时,我尝试做模式我找不到模式也没有达到 0 所以我所做的只是乘以直到找到 23 位.现在,当我查找实际值时,它说指数应该是 125,而这个数字实际上是 0 0111 0001 0111 1000 1101 0101 000。现在我不知道为什么我必须从指数中减去 2,因为我认为我在乘以 2 模式时不必移动点或何时停止。我留下了一张我工作的照片以防有帮助。提前致谢,希望你一切顺利
很难看清图片中的内容,但这是您的号码的二进制布局 0.2730
,既有单精度也有双精度 IEEE-754 表示形式。希望您可以使用它来仔细检查您的答案。如果您有不匹配的地方,请随时提出更具体的问题。
这是单精度(32 位)IEEE-754 表示形式的 0.2730
:
3 2 1 0
1 09876543 21098765432109876543210
S ---E8--- ----------F23----------
Binary: 0 01111101 00010111100011010101000
Hex: 3E8B C6A8
Precision: SP
Sign: Positive
Exponent: -2 (Stored: 125, Bias: 127)
Hex-float: +0x1.178d5p-2
Value: +0.273 (NORMAL)
同样,这次是双精度(64 位)IEEE754 表示:
6 5 4 3 2 1 0
3 21098765432 1098765432109876543210987654321098765432109876543210
S ----E11---- ------------------------F52-------------------------
Binary: 0 01111111101 0001011110001101010011111101111100111011011001000110
Hex: 3FD1 78D4 FDF3 B646
Precision: DP
Sign: Positive
Exponent: -2 (Stored: 1021, Bias: 1023)
Hex-float: +0x1.178d4fdf3b646p-2
Value: +0.273 (NORMAL)
IEEE-754 binary32 编码
0.2730的符号为正,所以IEEE-754 binary32格式的符号位为0
接下来,用 2 的幂显式缩放表示数字:0.2730 = 0.2730 • 20。其中,“•”(0.2730)之前的部分我们称其为有效位,2的次方为指数。
然后,调整此表示法,使尾数至少为 1 且小于 2。允许的调整是以 1 为增量调整指数,并相应地将尾数乘以或除以 2:0.2730 • 20 = 0.5460 • 2−1 = = 1.0920 • 2−2.
这称为规范化形式。这种形式的指数 -2 用于编码。为了在指数位中对其进行编码,我们添加了格式的固定偏差 127,并将结果写入 8 位二进制。 −2 + 127 = 125, 125二进制为01111101.
接下来,将有效数写入二进制至少24位:1.0920 = 1.0001011110001101010011111101111100111011…2。粗体显示前 24 位数字。我们只能使用 IEEE-754 binary32 格式的 24 位,我们看到剩下的部分在第 24th 位的一半以上,所以我们将四舍五入,得到 1.000101111000110101010002。那是我们的二进制有效数字。 (有关执行此操作的信息,请参阅下面的“十进制到二进制”。)
为了对有效数字进行编码,我们使用“.”之后的 23 位数字。 (已知前导数字为 1,因为我们将数字标准化以使其成为 1,因此它不需要包含在主要编码有效数字的位中。)这些位是 00010111100011010101000。
然后我们将符号位、指数位和有效位放在一起:0 01111101 00010111100011010101000。
十进制转二进制
十进制数1.0920转二进制:
- 写入前导“1”并将其删除,得到 .0920。乘以二,得到 0.1840。还要写“.”因为我们从这里开始。
- 写入前导“0”并将其删除,得到 .1840。乘以二,得到 0.3680.
- 写入前导“0”并将其删除,得到 .3680。乘以二,得到 0.7360.
- 写入前导“0”并将其删除,得到 .7360。乘以二,得到 1.4720.
- 写入前导“1”并将其删除,得到 .4720。乘以二,得到 0.9440.
根据需要继续。