计算机中浮点数的表示
计算机中的数据用二进制表示,但是十进制中的小数部分不能用二进制精确的表示,比如说0.1,用辗转相乘法会陷入循环。所以在有限的精度下,用近似值表示,这就会造成精度缺失。
——用指数来表示小数: 2 − 2 ⇒ ( 1 2 ) 2 2^{-2}\Rarr(\frac{1}{2})^2 2−2⇒(21)2,整数: 2 2 ⇒ ( 2 1 ) 2 2^2\Rarr (\frac{2}{1})^2 22⇒(12)2
可以看到:
- double 的尾数部分是 52 位,float 的尾数部分是 23 位,由于同时都带有一个固定隐含位(这个后面会说),所以 double 有 53 个二进制有效位,float 有 24 个二进制有效位,所以所以它们的精度在十进制中分别是
log10(2^53)
约等于15.95
和log10(2^24)
约等于7.22
位,因此 double 的有效数字是15~16
位,float 的有效数字是7~8
位,这些是有效位是包含整数部分和小数部分; - double 的指数部分是 11 位,而 float 的指数位是 8 位,意味着 double 相比 float 能表示更大的数值范围;