我们在教科书上经常看到,想判断两个浮点数是否相等,往往不能直接用 == 判断。这是因为浮点数的运算经常有误差,导致结果有细小的误差,在判断 『More』
吖恶俗牙色阿欢欢 - 回复 | (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
纠正一个错误, FCMP 的结果并不能影响标记寄存器,然后用于条件跳转。还需要做一次对 ax 的整数比较.
& 操作只需要一条整数指令就可以完成, 不需要去影响浮点寄存器. 结果比较也可以用整数指令完成.
这个问题来至今天公司同事问我他们的软件在不同的机器上运行结果不一样怎么办, 来至不同 CPU 间浮点运算的误差累积, 使得两个 clinet 计算出来的东西并不相等. 所以需要找到一个方法消除误差. 我建议每次浮点运算结束后用 & 消除误差. 之后觉得这个方法值得记录下来.
其实这个帖子的核心是如何利用精度降低来消除浮点运算的误差问题,两个浮点数的比较只是一个容易想到的实例,你没有看懂其中揭示的问题而已。
我一直是一个程序员, 只不过是一个"所谓的身价不断升高"的程序员而已。比我身价更高的程序员比比皆是, 比如 Michael Abrash.
ps. 如果你花了 100 个电阻的成本去思考如何节省一个 7 厘钱的电阻, 当这个产品产量达到 100 万的时候, 就节省了 7000 块.
为有趣的东西而工作就拥有工作和花钱两份有趣,为钱工作使花钱也变成烦恼。