计算机中的浮点数
二进制表示小数
说到浮点数,就要先说一下小数,计算机都是使用二进制来进行表示的,所以十进制中的小数部分就是2进制中的负指数次幂
如二进制中1.011就表示为十进制的1*
$2^0$+0*
$2^{-1}$+1*
$2^{-2}$+1*
$2^{-3}$,也就是1.375,其实这也是为什么在进行小数部分计算时不准确的原因
浮点数
很多编程语言中都提供了两种表示小数的数据类型,分别是双精度浮点数和单精度浮点数,双精度浮点数类型用64位,单精度浮点数类型用32位来表示
如何表示
浮点数是指符号、尾数、基数和指数这四部分来进行表示,计算机使用的是二进制,所以基数是2,不需要考虑基数,只需要用符号、尾数、指数三部分就可以表示浮点数
1 | // 指数也叫做阶码,阶码一般是用移码表示,尾数一般是补码表示(IEEE754标准中尾数也可以用原码表示),阶码的正负叫阶符,尾数的符号位叫数符 |
如果浮点数的阶码(包括一位阶符)用R位的移码表示,尾数(包括一位数符)用M位的补码表示,则浮点数表示的数值范围时
最大正数为 $+(1-2^{-M+1})*2^{2^{R-1}-1}$
最小负数为$-1*2^{(2^{R-1}-1)}$
双精度
1 | <-- 符号部分1位 --> <-- 指数部分11位 --> <-- 尾数部分52位 --> |
单精度
1 | <-- 符号部分1位 --> <-- 指数部分8位 --> <-- 尾数部分23位 --> |