首页 » 算法技术手册 » 算法技术手册全文在线阅读

《算法技术手册》值之间的比较

关灯直达底部

因为浮点值只是近似的,所以即使是最简单的浮点操作都变得不可信任。看看如下表达式:

这个表达式是真的表示两个浮点数完全相等吗?或者是表示这两个数近似相等吗(我们使用≌这个符号)?如果两个值是不同的,但是相差非常小,那么它们是否应该被认为是相同的呢?在笛卡儿坐标系上给定三个点,p0=(a,b)、p1=(c,d)和p2=(e,f),表示两个有向线段(p0,p1)和(p1,p2)。我们能够使用(c-a)(f-b)-(d-b)(e-a)这个式子来计算这两条线段是否共线(也就是在同一条线上)。如果这个式子的结果是0,那么这两条线段共线。让我们看看表3-2,就能够知道Java浮点计算中,误差是如何出现的。

你能够很快地看出,这三个点是共线的,直线方程是y=5*x。当计算浮点数的时候,浮点计算的固有误差影响了这个计算过程。使用浮点数,计算结果是0.00048828125。使用双浮点数,计算结果事实上是一个很小的负数!现在我们能够引入一个小值d,来决定两个浮点数是否存在≌关系。如果|a-b|<δ,那么我们认为a和b是相等的。否则,就有可能是x≌y和y≌z,但是可能不是x≌z。这个违背了传递性,增加了我们写出正确代码的难度。