How to save floating point Numbers?
浮点数的表示法
每一个浮点数都要转换成二进制版本的科学计数法再储存起来(也就是 x*2y),因此需要存储如下数据:正负号(0 正 1 负),科学计数法的幂(2 的次方数),科学计数法的小数部分(用-2 进制来表示)。
十进制转二进制
把这个数分成小数和整数两种形式。
整数直接转二进制然后使用科学计数法。
分数部分,每次乘 2,取该数的整数部分(要么取不到整数,要么取走 1),直到啥都不剩为止。取到的数从左往右写,最前面加 0.。
IEEE Floating Point Standard 754 标准
32bits(float)从左往右依次为:
-
31: 正负号
-
30-23: 8 bits 的幂数
-
22-0: 23 bits 的小数部分(因为科学记数法,所以第一位(小数点左侧)必然是 1,就不计算在内了)
64bits(double)从左往右依次为:
-
63:正负号
-
62-52:11 bits 的幂数
-
51-0:52 bits 的小数部分
exponent bias method
为了表示负数次幂,转换时在原本的幂数中加一些数字。
32 位+127,64 位+1023
这样 32 位幂的表示范围为-126~127,64 为-1022~1023
在这里我们没有用 two’s complement,原因是这种方法更容易比较两个数的大小。
浮点数的加法
首先要把他们对齐,也就是说把两个数字的幂转换成一样的。然后和十进制一样相加减,最后再把得到的结果转换成科学记数法。
浮点数的乘法
和加法同理。
不过可以在乘之前先判断一下结果的符号,同号为正异号为负。
然后相乘(小数部分相乘,幂数相加),最后转回科学记数法。
不过在实现运算的过程中要注意,储存幂数的时候用的是 bias method,而且小数部分中小数点左边的部分并没有实际存储在浮点数中。(血一样的教训)