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,而且小数部分中小数点左边的部分并没有实际存储在浮点数中。(血一样的教训)