commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gilles Sadowski <gil...@harfang.homelinux.org>
Subject Re: svn commit: r995035 - /commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/univariate/BrentOptimizer.java
Date Fri, 10 Sep 2010 20:55:33 GMT
> > I don't know whether it is one of those rare cases. The algorithm
> > description in ALGOL uses the "=" sign while the FORTRAN implementation (in
> > the appendix) works around the problem by inversing the checks:
> 
> It may be the case. There is a similar one in the Brent solver, the
> semantic of the test is to check if we have just set one intermediate
> value exactly to one of the bound or if it is a result of some
> interpolation.
> 
> Exact equality or inequality should be considered with the same care. In
> many cases, they should be replaced by proximity checks. Proximity
> checks need a threshold and it is very difficult to find a general one
> (some people may well use numbers in the range of 1.0e-50 which is
> perfectly computable in floating point).
> 
> There is also one very special trick with doubles equality and
> inequality: tests involving NaN always return false. So if for example x
> is a NaN and y is a regular number (normal, subnormal or infinite), all
> the following tests will return false, even the two last ones!
> 
>  x < y, x > y, x <= y, x >= y, x == y, x != y, x == x
> 
> This implies that replacing (x == y) by !(x != y) is a safe replacement
> only if there are no NaNs involved.
> 
> However, I don't think the test here has been written with NaNs in mind,
> so I guess it really is a check for interpolation or no interpolation. I
> did not check the algorithm, though.

I don't think so either.
With the current change, the meaning is as close to "==" as possible since
only two adjacent floating point numbers are considered equal by method
"equals" from "MathUtils". So if checkstyle is happy with that, we could
leave so without much risk, I think.

Gilles

> >>> -                    } else if (fu <= fv || v == x || v == w) {
> >>> +                    } else if (fu <= fv ||
> >>> +                               MathUtils.equals(v, x) ||
> >>> +                               MathUtils.equals(v, w)) {
> >>>                          v = u;
> >>>                          fv = fu;

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Mime
View raw message