各种整型类型对大多数软件开发项目而言够用了。然而,面向金融和数学的程序经常使用 浮点数。C语言中的浮点数有float、double和long double类型。
1.从科学计数法理解浮点数的表示
首先,我们从科学计数法来理解浮点数。
普通计数法:+302657264526
科学计数法:
我们再把科学计数法换一种表达方式:
上式中有四个部分:
阶符 | 阶码的数值部分 | 数符 | 尾数的数值部分 |
阶符和阶码的数值部分统称阶码,数符和尾数的数值部分统称尾数。
所以我们参考科学计数法,将浮点数表示为:
式中,r是浮点数阶码的底,即科学计数法中的10,但其实这个底不一定非要为10,可以是100、1000或者4和8,若将浮点数用二进制,则r=2。E为阶码,M为尾数。所以在计算机中,将r默认设置为2,再通过存储E和M的二进制,就可以表示出一个浮点数了。
+11 | +3.026 |
---|---|
阶码反映数值大小 | 尾数反映精度 |
在这里,相较于,科学计数法中,省略了一部分尾数,这就对应了C语言里可能出现的浮点数舍入错误。因为尾数的位数n反应浮点数的精度。通常float类型要占用32位(即4个字节),其中8位用于表示阶码,剩下24位用于表示尾数。有限的24位只能表示有限位数的有效数字。 = 16777216,共有8个十进制位数,所以,foalt类型能够表示的有效位数通常是7位或8位。
2.浮点数的表示
计算机中是如何用二进制将上述的阶码与尾数组织存储起来的呢?有一个IEEE 754标准,C语言采用了IEEE 754标准来表示浮点数。
以十进制数为例,若将转换为float类型,该标准规定格式如下:
尾数部分,用原码表示 | ||
---|---|---|
E | M | |
1 | 01111110 | 10000000000000000000000 |
数符(1位) | 阶码部分,用移码(8位) | 尾数数值位(23位) |
IEEE 754标准规定常用的浮点数格式有短浮点数(单精度、float)、长浮点数(双精度、double)、临时浮点数(long double),如下表所示。