[关闭]
@darkproject 2018-02-21T09:12:50.000000Z 字数 660 阅读 896

浮点数编码的深入理解(关于猥琐的题)

猥琐


计算2^x的浮点表示,其中u2f用于表示无符号整数的0/1序列

  1. float f2(int x)
  2. {
  3. unsigned exp, frac;
  4. unsigned u;
  5. if (x < _) { //值太小,返回0.0
  6. exp = _;
  7. frac = _;
  8. } else if (x < _) { //返回非规格化数据结果
  9. exp = _;
  10. frac = _;
  11. } else if (x < _) { 返回规格化数据
  12. exp = _;
  13. frac = _;
  14. } else { 值太大,返回无穷
  15. exp = _;
  16. frac = _;
  17. }
  18. u = exp << 23 | frac;
  19. return u2f(u);
  20. }

IEEE浮点标准用 V=(-1)^S * M * 2^E 的形式来表示一个数
1. 这里s是首符用于判断这个数的正负,0为正,1为负(此题可以不用考虑)
2. M代表尾数,E为阶码

ps:我们用exp表示编码E的二进制,用frac编码尾数M
一个float单精度浮点由32位二进制组成,我们将它按格式拆分为
0 00111111 00010000000000000000000
长度分别为1和8和23组成32位二进制。
这里第一个序列代表首符,第二个序列代表表示阶码的exp,第三个序列代表表示尾数的frac
规定:规格化数据:exp的二进制表示中不全部为1也不全部为0
非规格化数据:exp的二进制表示中全部为0

解释:

  1. 第一个if这里返回0.0,即代表数据2^x超过了float的最小范围(即最小的正非规格化数据)2^-149,此时阶码和尾数均为0。
  2. 第4个选择语句,即大于float最大范围(最大的规格化数据)2^127,此时阶码代表的二进制位为全部为1
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注