Skip to content

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