如何手动将十进制(基数为10)的数字转换为IEEE 754单精度浮点格式?我知道它有三个部分,一个符号,一个指数和一个尾数。我只是不完全理解最后两个部分实际代表什么。
答案 0 :(得分:26)
找到小于你的数字的2的最大幂,例如,如果你从x = 10.0开始然后2 3 = 8,那么指数是3.指数偏差为127所以这意味着指数将表示为127 + 3 = 130.然后尾数为10.0 / 8 = 1.25。 1是隐式的,因此我们只需要表示0.25,即表示为23位无符号小数的010 0000 0000 0000 0000 0000。符号位为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;
}
答案 1 :(得分:11)
取一个数字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
说明: 位的高位是数字的符号。 数字以符号幅度格式存储。 指数以8位字段格式存储,偏向127指数 二进制点右侧的数字以23位的低位存储。 注意---这种格式是IEEE 32位浮点格式
答案 2 :(得分:8)
浮点数只是scientific notation。假设我要求您使用科学记数法表达circumference of the Earth in meters。你会写:
4.007516×10 7 米
exponent 就是:这里十的力量。尾数是数字的实际数字。当然,这个标志只是正面或负面的。因此,在这种情况下,指数为7,尾数为4.007516。
IEEE754和小学 - 科学记数法之间唯一显着的区别是浮点数在 base 2 中,所以它不是第十个能力的东西,它是两倍于一些东西。所以你要用普通的人类科学记数法写出256,如:
2.56×10 2 (尾数2.56和指数2),
在IEEE754中,它是
1×2 8 - 尾数为1,指数为8.