我将如何手动将十进制(以 10 为底)数字更改为 IEEE 754 单精度浮点格式?我知道它由三个部分组成,一个符号,一个指数和一个尾数。我只是不完全理解最后两部分实际代表什么。
3 回答
找到小于您的数字的 2 的最大幂,例如,如果您从 x = 10.0 开始,然后 2 3 = 8,则指数为 3。指数偏置 127,因此这意味着指数将表示为 127 + 3 = 130。尾数为 10.0/8 = 1.25。1 是隐含的,所以我们只需要表示 0.25,即 010 0000 0000 0000 0000 0000 表示为 23 位无符号小数。符号位为 0 表示正数。所以我们有:
s | exp [130] | mantissa [(1).25] |
0 | 100 0001 0 | 010 0000 0000 0000 0000 0000 |
0x41200000
您可以使用简单的 C 程序测试表示,例如
#include <stdio.h>
typedef union
{
int i;
float f;
} U;
int main(void)
{
U u;
u.f = 10.0;
printf("%g = %#x\n", u.f, u.i);
return 0;
}
取一个数字 172.625。这个数字是 Base10 格式。
将此格式转换为base2格式为此,首先将172转换为二进制格式
128 64 32 16 8 4 2 1
1 0 1 0 1 1 0 0
172=10101100
将 0.625 转换为二进制格式
0.625*2=1.250 1
0.250*2=.50 0
0.50*2=1.0 1
0.625=101
二进制格式 172.625=10101100.101。这是 base2 格式 10101100*2
移动这个二进制数
1.0101100*2 **7 Normalized
1.0101100 is mantissa
2 **7 is exponent
添加指数 127 7+127=134
将 134 转换为二进制格式
134=10000110
数字是正数,所以数字 0 的符号
0 |10000110 |01011001010000000000000
解释:位的高位是数字的符号。number 以符号大小格式存储。指数以 8 位字段格式存储,向指数偏移 127 二进制点右侧的数字以 23 位的低位存储。注意---此格式为 IEEE 32 位浮点格式
浮点数只是科学记数法。假设我让你用科学计数法以米表示地球的周长。你会写:
4.007516×10 7米
指数就是:这里是十的幂。尾数是数字的实际数字。当然,符号只是正面或负面的。所以在这种情况下,指数是 7 ,尾数是 4.007516 。
IEEE754 和小学科学记数法之间的唯一显着区别是浮点数以2 为底,所以它不是某物的 10 次方,而是某物的 2 次方。所以你可以用普通的人类科学记数法写出 256 为:
2.56×10 2(尾数 2.56 和指数 2),
在 IEEE754 中,它是
1×2 8 — 尾数为 1,指数为 8。