在计算机编程语言里面,小数也称为浮点数,表示小数点的位置是可以“浮动”的。

因为,小数一般用科学计数法描述,例如0.1234可以表示为1234e-4,即1234*10^-4。这样的浮点数在计算机中用三部分存储,如下图:符号:可正可负;

位移:也称为偏移量,显示小数量应该左移或右移构成实际数字的位移量。以上面为例,位移量为-4;

定点数,通常表示尾数部分,如上面的1234。

为什么要用浮点数来存储数? 原因是它可以极大增加可存储的实数范围,尤其是带有很大整数部分或者很小的小数部分的实数。

例如,如果用浮点数表示法表示12340000000000,科学计数法1.234*10^13,对应上面表示为+,位移量(13)以及定点数(1.234)。

同样,如果是小数-0.00000000001234,科学计数法表示-1.234*10^-11,对应上面表示为-,位移量(-11),定点数1.234。

当然, 我们不能随机指定尾数中小数点的位置,一种规范化的方法就是指定小数点左边保留一位非零数字,即上面的示例中1.234这种。

对于浮点数,它的表示范围取决于两部分,即尾数和指数长度。一般默认的单精度浮点数占32字节,双精度浮点数占64字节。而IEEE定义的每一部分位数如下:

浮点数表示法的IEEE标准

据此,我们可以推断出浮点数的表示范围。float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。这是非常大的数了,但是即使如此,如果运算超出了这个范围,也会产生溢出。比如,将最大的浮点数加1 ,就产生了溢出错误。

另外一个问题,就是浮点数是有误差的——数的精度,这是由尾数的长度决定的。以float为例,如果有一个小数,用二进制表示为

(111111111111.111111111111111)

规范化后为:

(1.11111111111111111111111111)

这样,小数点后面有26个1。而float小数点后只能存储23个1。因此,多余的3个1会被丢弃。

编程语言C中,浮点数的处理会默认以double处理,这样数的表示范围大、精度高。