返回

浮点数的精度控制问题

我们在教科书上经常看到,想判断两个浮点数是否相等,往往不能直接用 == 判断。这是因为浮点数的运算经常有误差,导致结果有细小的误差,在判断相等时需要忽略这些误差。比如判断 a==b 经常被写作 fabs(a-b)<0.00001 这样的形式。

其实,这里可以用更高效率的方式,即直接降低精度,只需要做一个 & 操作就可以了。

比如想对 double f 降低精度,只需要做 *((__int64*)&f)&=~0xf; 0xf 是可调整的,这一句就是把底数最后几位清为 0 而已。

x86 用的浮点数是 IEEE 754 标准.

一个 double 有 64 bit. 最高一个 bit 是符号位. (浮点数的正负不是用补码表示的) 低 52 [0,51] bits 是底数, 所有的浮点数都是 1.xxxxxx * 2^n 表示的. 这个 xxxxx 就是底数.1 是省略不写的.

[52,62] 表示的这个 n, 也就是指数. 这个 n 有 11 bits, 是用移码表示的. 为什么用移码? 因为最终想用 8 字节的 0 表示浮点数的 0. 而且可以直接用整数的大小比较, 比较浮点数. 11 bits 的 0 表示的是负无穷, 0 其实是用 1*2^(-无穷大) 表示出来的。

名字: 自动排版 密码:

回复 | (412) | 云风 | 2004-07-17 01:49:15