【发布时间】:2011-01-25 04:04:10
【问题描述】:
如何手动将十进制(以 10 为基数)数字更改为 IEEE 754 单精度浮点格式?我知道它由三个部分组成,一个符号,一个指数和一个尾数。我只是不完全理解最后两部分实际代表什么。
【问题讨论】:
标签: binary floating-point ieee-754
如何手动将十进制(以 10 为基数)数字更改为 IEEE 754 单精度浮点格式?我知道它由三个部分组成,一个符号,一个指数和一个尾数。我只是不完全理解最后两部分实际代表什么。
【问题讨论】:
标签: binary floating-point ieee-754
找到小于你的数字的 2 的最大幂,例如,如果你从 x = 10.0 开始,那么 23 = 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;
}
【讨论】:
浮点数就是scientific notation。假设我让你用科学记数法表达circumference of the Earth in meters。你会写:
4.007516×107m
指数就是:这里是十的幂。尾数是数字的实际数字。当然,符号只是正面或负面的。所以在这种情况下,指数是 7,尾数是 4.007516。
IEEE754 和小学科学记数法之间的唯一显着区别是浮点数以 2 为底,所以它不是某物的 10 次方,而是 2 次方某物。所以你可以用普通的人类科学记数法将 256 写成:
2.56×102(尾数 2.56 和指数 2),
在 IEEE754 中是
1×28 — 尾数为 1,指数为 8。
【讨论】:
取一个数字 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 位浮点格式
【讨论】: