内存中的储存形式(IEEE-745)
Address 3 2 1 0
Content SEEEEEEE EBBBBBBB BBBBBBBB BBBBBBBB
其中的字母分别代表:
- S(Significand):1 - 正负号
- E(Exponent):8 - 指数部分
- B(Base):23 - 底数部分
这样, 整个浮点数表示起来就是:
N进制的小数
看到10进制的小数, 小数点是用来分隔指数正负位的:
推广到N进制, 形式是完全相同的, 这里用二进制做一个例子:
构造一个浮点数
以12.625为例子. 首先我们推算一下它的二进制形式是什么. 如我们所知, 整数部分和小数部分的位置是恒定不变的, 因为它们是否小于1这个性质, 无论在什么进制之下都不会改变. 首先算整数部分:
小数部分(不知道是否注意到, 小数部分只有是2^n的和才有可能被表示成不循环小数. 诸如0.7, 0.3都是二进制的无限循环小数):
这样, 我们得到了一个二进位的小数1100.101, 并且化成IEEE-745标准形式:
Address 3 2 1 0
Content SEEEEEEE EBBBBBBB BBBBBBBB BBBBBBBB
Value 01000001 01001010 00000000 00000000
Hex 41 4A 00 00
现在我们得到了一个整数0x414A0000, 把它输出出来看看是多少:
$ cat test.c
#include <stdio.h>
int main()
{
union {
unsigned long u;
float f;
} u;
u.u = 0x414a0000;
printf("%f\n", u.f);
return 0;
}
$ ./test
12.625000