浮点数
在计算机科学中,浮点(英语:floating point,缩写为FP)是一种对于实数的近似值数值表现法,由一个有效数字(即尾数)加上幂数来表示,通常是乘以某个基数的整数次指数得到。以这种表示法表示的数值,称为浮点数(floating-point number)。利用浮点进行运算,称为浮点计算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。
我们可以感性地将其理解为“浮动的小数点”。
为什么这样说?我们可以看下面一个实例:
$12.345=1.2345 \times 10^{1}=0.12345 \times 10^{2}$
我们可以看到,在这样的记数法中,小数点其实是可以“浮动”的。
事实上,在计算机科学中,浮点数的定义非常类似于科学记数法,在IEEE754标准中,浮点数被定义为$\pm M \times 2^E$,其中M被称为分数值,E被称为指数偏移值。其中要求M的首位必须为1,所以在其中将此位隐藏。
指数偏移值,即浮点数表示法中指数域的编码值,等于指数的实际值加上某个固定的值,IEEE 754标准规定该固定值为$2^{e-1}-1$,其中$e$为存储指数的比特的长度。
拿32位单精度浮点数(float)来说,它的构成如下表:
位(不考虑大端小端) | 功能 |
---|---|
1 | 符号位 |
2~9 | 指数偏移值位(E) |
10~32 | 分数值位(M) |
在这套规则下,有几个特殊值被人为地定义,包括负零、正无穷、负无穷等(详见上述IEEE754标准链接)。
而双精度浮点数(double)就是在单精度浮点数的基础上进一步将指数位宽度拓宽到了11位,将位数位宽度进一步拓宽到了52位。
- 浮点数最大能有多大呢?
对于单精度浮点数
$±(2−2^{−23}) × 2^{127} ≈ ±3.4×10^{38}$
这是C语言中单精度浮点数的最大值。
- 浮点数的精度是多少?
对于单精度浮点数而言,前六位数是保证准确的。
原因是对于23位分数值位,有最大值$2^{23}=8388608$,可以保证前六位小数绝对精确。
- 浮点数是怎么处理舍入的呢?
事实上,IEEE754标准中提供了四种舍入方法。
- 舍入到最接近:舍入到最接近,在一样接近的情况下偶数优先(Ties To Even,这是默认的舍入方式):会将结果舍入为最接近且可以表示的值,但是当存在两个数一样接近的时候,则取其中的偶数(在二进制中是以0结尾的)。(向偶取整)
- 朝+∞方向舍入:会将结果朝正无限大的方向舍入。
- 朝-∞方向舍入:会将结果朝负无限大的方向舍入。
- 朝0方向舍入:会将结果朝0的方向舍入。
参考资料: