我们在教科书上经常看到,想判断两个浮点数是否相等,往往不能直接用 == 判断。这是因为浮点数的运算经常有误差,导致结果有细小的误差,在判断相等时需要忽略这些误差。比如判断 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^(-无穷大) 表示出来的。
吖恶俗牙色阿欢欢 - 回复 | (1980) | 好人和坏人大河人云亦 | 2008-06-06 03:12:20
我觉得降低精度的方法有问题。 二进制数: 1.00000 和 0.11111比较 『More Lines』- 回复 | (962) | kaikai | 2006-02-14 09:39:59
如果有人对浮点数比较的问题有兴趣, 这里给个参考链接 :) 当然如上面我的一个回帖所说, 我的原意倒并非讨论浮点数比较的.
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm - 回复 | (415) | 云风 | 2004-07-18 12:53:15
对于一个除了奔腾之外其它什么硬件都不用的程序员来说,这种说法是傻不啦叽。
你自己也知道,对于奔腾系列来说 fabs(a-b)<0.00001 语句最终汇编 『More』 - 回复 | (413) | BenevolentLiao | 2004-07-17 05:49:53