Le 10/09/2010 22:55, Gilles Sadowski a écrit :
>>> 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.

That's fine to me.

Luc

> 
> 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-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
> 


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

Reply via email to