1 浮点数的定义
提及浮点数,脑中必然会联想到定点数。所以首先我们看下两者的定义,一探究竟。
在计算机中,数据有两种表达方式:定点数和浮点数,注意,这仅仅是数的两种表达方式,而不是两种数。
1、定点数:
定点数指小数点在数中的位置是固定不变的,通常有定点整数和定点小数。在对小数点位置作出选择之后,运算中的所有数均应统一为定点整数或定点小数,在运算中不再考虑小数问题。
(1)定义:数据中小数点位置固定不变的数
(2)种类:定点整数
(3)小数点在符号位与有效位之间。
注:定点数受字长的限制,超出范围会有溢出。
2、浮点数:
浮点数中小数点的位置是不固定的,用阶码和尾数来表示。通常尾数为纯小数,阶码为整数,尾数和阶码均为带符号数。尾数的符号表示数的正负;阶码的符号则表明小数点的实际位置。
(1)形式:N=M×2E
(2)M:尾数
(3)E:阶码
(4)在计算机中M和E表示形式为
阶码 尾数符号 尾数
将其与数学中的科学记数法进行比较。
注:其浮点数的精度由尾数决定,数的表示范围由阶码决定。
2 为什么要使用浮点数?
定点数的表示范围固定、有限。比如使用8位十进制来表示一个整数。
- 最大:999999999
- 最小:000000000
如果我们想要表示更大的一个数,便无从下手。所以数学中我们一般采用科学计数法来进行简化表示。
在计算机里,我们也可以用一样的办法,用科学计数法来表示实数。浮点数的科学计数法的表示,有一个 IEEE 的标准,它定义了两个基本的格式。一个是用 32 比特表示单精度的浮点数,也就是我们常常说的 float 或者 float32 类型。另外一个是用 64 比特表示双精度的浮点数,也就是我们平时说的 double 或者 float64 类型。双精度类型和单精度类型差不多,这里,我们来看单精度类型,双精度你自然也就明白了。
3 32位浮点数表示范围
关于最小数与最大数的表示,第一次学到这部分时,有些不理解。
最大数举例
注:理解的关键点在于尾数以及对应2进制指数转为十进制表示。
4 浮点数的精度缺失
public class FloatPrecision { public static void main(String[] args) { float a = 20000000.0f; float b = 1.0f; float c = a + b; System.out.println("c is " + c); float d = c - a; System.out.println("d is " + d); } }
对应的输出结果就是:
c is 2.0E7 d is 0.0
应对精度丢失,我们可以使用Kahan Summation算法,令结果更为精确。