学习篇 | 浮点数的表示规则

导语

本篇博客主要讲述的是: C语言中数据『浮点数』在内存中是如何存储

 

目录

导语

表示形式

规定

指数 E 有三种情况 


 

表示形式

根据国际标准 IEEE (电气和电子工程协会) 754,任意一个二进制浮点数 V 可以表示成下面的形式:

  • (-1)^S * M * 2Ê
  • (-1)^S 表示符号位,当 S=0,V 为正数;当 S=1,V 为负数
  • M 表示有效数字,大于等于 1,小于 2
  • 2Ê 表示指数位

 

举例来说:

十进制的 5.0,写成二进制是 101.0,相当于 1.01×2^2

那么,按照上面 V 的格式,可以得出 S=0,M=1.01,E=2 

十进制的 -5.0,写成二进制是 -101.0,相当于 -1.01×2^2

那么,S=1,M=1.01,E=2

 

 

 

规定

IEEE 754 规定:

对于 32 位的浮点数,最高的 1 位是符号位 S,接着的 8 位是指数 E,剩下的23位为有效数字 M

学习篇 | 浮点数的表示规则_第1张图片

对于 64 位的浮点数,最高的 1 位是符号位 S,接着的 11 位是指数 E,剩下的 52 位为有效数字 M

学习篇 | 浮点数的表示规则_第2张图片

 

IEEE 754 对有效数字 M 和指数 E,还有一些特别规定

前面说过,1 ≤ M < 2,也就是说,M 可以写成 1.xxxxxx 的形式,其中 xxxxxx 表示小数部分

 

IEEE 754 规定:

在计算机内部保存 M 时,默认这个数的第一位总是 1,因此可以被舍去,只保存后面的 xxxxxx 部分。比如保存 1.01 的时候,只保存 01,等到读取的时候,再把第一位的 1 加上去。这样做的目的,是节省 1 位有效数字。以 32 位浮点数为例,留给 M 只有 23 位,将第一位的 1 舍去以后,等于可以保存 24 位有效数字。

至于指数 E,情况就比较复杂。

首先,E 为一个无符号整数 ( unsigned int ) 这意味着,如果 E 为 8 位,它的取值范围为 0~255;如果 E 为 11 位,它的取值范围为 0~2047。但是,我们知道,科学计数法中的 E 是可以出现负数的,所以 IEEE 754 规定,存入内存时 E 的真实值必须再加上一个中间数,对于 8 位的 E,这个中间数是 127;对于 11 位的 E,这个中间数是 1023。比如 2^10 的 E 是 10,所以保存成 32 位浮点数时,必须保存成 10+127=137,即 10001001。

 

 

指数 E 有三种情况 

  • E 不全为 0 或不全为 1

这时, 浮点数就采用下面的规则表示, 即指数E的计算值减去127(或1023), 得到真实值, 再将有效数字M前加上第一位的 1, 比如: 0.5 (1/2) 的二进制形式为 0.1,  由于规定正数部分必须为 1, 即将小数点右移 1 位, 则为 1.0*2^(-1), 其阶码为 -1+127=126, 表示为 01111110, 而尾数 1.0 去掉整数部分为 0, 补齐 0 到 23 位 00000000000000000000000, 则其二进制表示形式为: 0 01111110 00000000000000000000000

 

  • E全为 0

这时, 浮点数的指数 E 等于 1-127 (或者 1-1023) 即为真实值, 有效数字 M 不再加上第一位的 1, 而是还原为 0.xxxxxx 的小数, 这样做是为了表示 ±0 (正负零), 以及接近 0 的很小的数字

 

  • E全为 1

这时, 如果有效数字 M 全为 0, 表示 ± (正负) 无穷大 (正负取决于符号位 S)

 


◆ 回到开头 @ 目录:

表示形式

规定

指数 E 有三种情况 

◆ 其他博客 @ https://blog.csdn.net/weixin_42194161

◆ 相关博客

学习篇 | 初识C语言----关键字 

逻辑题 | 喝 m 瓶汽水至少需要多少钱?

探索篇 | C语言改变控制台输出内容颜色


感谢阅读本篇博客,如果有不错的建议或意见,欢迎在评论区留言,喜欢的话,麻烦点个赞加关注哦~~~

你可能感兴趣的:(01.C语言,11.学习篇)