在计算机科学中,浮点数是一种对于实数的近似值数值表现法,利用浮点进行运算,称为浮点计算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。Go提供了两种size的浮点数,float32和float64。它们的算术规范是由IEEE754国际标准定义,现代CPU都实现了这个规范。
内存中的float32
定义
float32——单精度浮点类型使用32位(4个字节)存储一个浮点数。
IEEE754-2008中定义了它的结构:
符号位 | 指数 | 尾数 |
---|---|---|
S | EEEEEEEE | FFFFFFFFFFFFFFFFFFFFFFF |
1位二进制表示符号: 0,正; 1,负 | 8位二进制表示127偏移量的指数 | 23位二进制表示23+1位小数部分 |
例子
以6.9为例子,将生活中常见的十进制转化为机器存储的二进制float。
- 将整数和小数部分分别转化为二进制;
1 | 6(十进制) = 110(二进制) |
- 将小数点左移(或右移)到第一个有效数字之后;
1 | 110.1110011001100...... => 1.101110011001100......(左移2位) |
- 填充尾数部分;
1 | 从小数点后第一位开始,数出23个来,填充到上面float内存结构的尾数部分。默认小数点前面一定有且只有一个1,所以把这个1省略了,这也是为什么定义中尾数是23+1位的原因。 |
- 填充指数部分;
1 | 8位表示阶码,无符号是[1,254],0和255用于表示非规格化情况,有符号位是[-126,127],引入偏移量以免使用补码带来计算复杂度。 |
- 填充符号位。
符号位 | 指数 | 尾数 |
---|---|---|
0 | 10000001 | 10111001100110011001100 |
不精确的原因
浮点型只有最后一位为5时才能用有限位数的二进制来表示;
单精度浮点型尾数部分只能保存23位。
内存中的float64
float64——双精度浮点类型使用64位(8个字节)存储一个浮点数。
IEEE754-2008中定义了它的结构:
符号位 | 指数 | 尾数 |
---|---|---|
S | EEEEEEEEEEE | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF |
1位二进制表示符号: 0,正; 1,负 | 11位二进制表示1023偏移量的指数 | 52位二进制表示52+1位小数部分 |