浮点数在计算机中是如何用二进制表示的

各种整型类型对大多数软件开发项目而言够用了。然而,面向金融和数学的程序经常使用 浮点数。C语言中的浮点数有float、double和long double类型。

数据类型的字节数和取值范围.png

1.从科学计数法理解浮点数的表示

首先,我们从科学计数法来理解浮点数。

普通计数法:+302657264526
科学计数法: +3.026*10 ^ {11}

我们再把科学计数法换一种表达方式:
+11+3.026

上式中有四个部分:

J_f J_1J_2...J_m S_f S_1S_2...S_n
阶符 阶码的数值部分 数符 尾数的数值部分

阶符和阶码的数值部分统称阶码,数符和尾数的数值部分统称尾数。

所以我们参考科学计数法,将浮点数表示为:
N = r^E*M

式中,r是浮点数阶码的底,即科学计数法中的10,但其实这个底不一定非要为10,可以是100、1000或者4和8,若将浮点数用二进制,则r=2。E为阶码,M为尾数。所以在计算机中,将r默认设置为2,再通过存储E和M的二进制,就可以表示出一个浮点数了。

+11 +3.026
阶码反映数值大小 尾数反映精度

在这里,相较于+302657264526,科学计数法3.026*10{11}中,省略了一部分尾数,这就对应了C语言里可能出现的浮点数舍入错误。因为尾数的位数n反应浮点数的精度。通常float类型要占用32位(即4个字节),其中8位用于表示阶码,剩下24位用于表示尾数。有限的24位只能表示有限位数的有效数字。2^{24} = 16777216,共有8个十进制位数,所以,foalt类型能够表示的有效位数通常是7位或8位。

2.浮点数的表示

计算机中是如何用二进制将上述的阶码与尾数组织存储起来的呢?有一个IEEE 754标准,C语言采用了IEEE 754标准来表示浮点数。

以十进制数-0.75为例,若将-0.75转换为float类型,该标准规定格式如下:

尾数部分,用原码表示
m_s E M
1 01111110 10000000000000000000000
数符(1位) 阶码部分,用移码(8位) 尾数数值位(23位)

IEEE 754标准规定常用的浮点数格式有短浮点数(单精度、float)、长浮点数(双精度、double)、临时浮点数(long double),如下表所示。

IEEE 754.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容