本帖最后由 egberto 于 2019-6-5 10:28 编辑
中午又看了下关于IEEE二進位浮點數算術標準(IEEE 754)的算法,
稍微理解了一点,在这里备忘一下。
所谓IEEE二進位浮點數算術標準(IEEE 754),
是用32位的2进制数来记录数字的一套标准。
有效精度里的数值,都可以用2进制表示成(1.xxx・・・) * 2的N次方
(这里括号里的数字是2进制记法,下同),
比如11=(1.011) * 2的3次方。
这32位中,
第1位:正负号(0为正,1为负)
第2位~第9位:指数值(2的N次方里的N,这里要加上一个叫做指數偏移值的固定值127)
第10位~第32位:小数值(1.011形式里的011)
举个例子,1这个数字,用2进制表达的话就是
1 = (1.0) * 2的0次方。
因为是正数,第1位:0
0次方,加上偏移值127,第2位~第9位:011 1111 1
小数点后皆为零,第10位~第32位:000 0000 0000 0000 0000 0000
故此
0-011 1111 1-000 0000 0000 0000 0000 0000
3 F 8 0 0 0 0 0
同理
-1
1-011 1111 1-000 0000 0000 0000 0000 0000
B F 8 0 0 0 0 0
2 = (1.0) * 2的1次方
0-100 0000 0-000 0000 0000 0000 0000 0000
4 0 0 0 0 0 0 0
3 = (1.1) * 2的1次方
0-100 0000 0-100 0000 0000 0000 0000 0000
4 0 4 0 0 0 0 0
4 = (1.0) * 2的2次方
0-100 0000 1-000 0000 0000 0000 0000 0000
4 0 8 0 0 0 0 0
5 = (1.01) * 2的2次方
0-100 0000 1-010 0000 0000 0000 0000 0000
4 0 A 0 0 0 0 0
10 = (1.01) * 2的3次方
0-100 0001 0-010 0000 0000 0000 0000 0000
4 1 2 0 0 0 0 0
另外小数的情况,要小数部分一直乘以2,直到小数位为零。
比如12.375,小数部分为0.375。
0.375 * 2 = 0.750 = 0 + 0.750 ⇒ b−1 = 0
0.750 x 2 = 1.500 = 1 + 0.500 ⇒ b−2 = 1
0.500 x 2 = 1.000 = 1 + 0.000 ⇒ b−3 = 1
得到 (0.375)用2进制表示就是 (0.011)
12.375 = (1100.011) = (1.100011) * 2的3次方
0-100 0001 0-100 0110 0000 0000 0000 0000
4 1 4 6 0 0 0 0
反推4楼大大的3fc00000,
0-011 1111 1-100 0000 0000 0000 0000 0000
也就是(1.1) * 2的0次方 = 1.1
基本上是看不出效果的