浮点数简介

内存中的储存形式(IEEE-745)

Address 3        2        1        0 
Content SEEEEEEE EBBBBBBB BBBBBBBB BBBBBBBB

其中的字母分别代表:

  • S(Significand):1 - 正负号(-1)^S
  • E(Exponent):8 - 指数部分
  • B(Base):23 - 底数部分

这样, 整个浮点数表示起来就是:

(-1)^S \times 1.BBBBBBBBBBBBBBBBBBBBBBB \times 2 ^{EEEEEEEE - 01111111}

N进制的小数

看到10进制的小数, 小数点是用来分隔指数正负位的:

123.456
= 1 \times 10^2 + 2 \times 10^1 + 3 \times 10^0 + 4 \times 10^{-1} + 5 \times 10^{-2} + 6 \times 10^{-3}

推广到N进制, 形式是完全相同的, 这里用二进制做一个例子:

(101.0101)_2
= 2^2 + 2^0 + 2^{-2} + 2^{-4}
= 4+1+{1 \over 4}+{1 \over 16}
= 5.3125

构造一个浮点数

以12.625为例子. 首先我们推算一下它的二进制形式是什么. 如我们所知, 整数部分和小数部分的位置是恒定不变的, 因为它们是否小于1这个性质, 无论在什么进制之下都不会改变. 首先算整数部分:

12 \div 2 = 6 \cdots 0
6 \div 2 = 3 \cdots 0
3 \div 2 = 1 \cdots 1
1 \div 2 = 0 \cdots 1
\therefore \ (12)_10 = (1100)_2

小数部分(不知道是否注意到, 小数部分只有是2^n的和才有可能被表示成不循环小数. 诸如0.7, 0.3都是二进制的无限循环小数):

0.625 \times 2 = 1 + 0.25
0.25 \times 2 = 0 + 0.5
0.5 \times 2 = 1
\therefore \ (0.625)_{10} = (0.101)_2

这样, 我们得到了一个二进位的小数1100.101, 并且化成IEEE-745标准形式:

1100.101 = 1.100101 \times 2^{00000011 + 01111111 - 01111111}

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

posted on 2015-01-02 14:38 Shihira 阅读(2028) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

统计

公告

留言簿(2)

随笔分类

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜