浮点数

计算机科学中,浮点(英语: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的方向舍入。

参考资料:

https://zh.wikipedia.org/zh-cn/IEEE_754

https://zh.wikipedia.org/zh-cn/%E6%B5%AE%E7%82%B9%E6%95%B0

Last modification:October 19, 2019
博客维护不易,如果你觉得我的文章有用,请随意赞赏