[Fortran, Patch] PR 34192 - Fix compile-time evaluation of NEAREST
Jerry DeLisle
jvdelisle@verizon.net
Fri Nov 23 20:55:00 GMT 2007
Tobias Burnus wrote:
> :ADDPATCH fortran:
>
> We had several problems with the compile-time evaluation for NEAREST for
> 0.0 and subnormal numbers.
>
>>From the standard:
>
> -------------------- cut ---------------
>
> "NEAREST (X, S)
> Description. Returns the nearest different machine-representable number in a
> given direction.
> X shall be of type real.
> S shall be of type real and not equal to zero.
> Result Characteristics. Same as X.
> Result Value. The result has a value equal to the machine-representable number
> distinct from X and nearest to it in the direction of the infinity with the
> same sign as S.
>
> NOTE 13.16 Unlike other floating-point manipulation functions, NEAREST operates
> on machine-representable numbers rather than model numbers. On many systems
> there are machine-representable numbers that lie between adjacent model
> numbers."
>
> -------------------- cut ---------------
>
>
> Problems:
>
> a) gfortran gave an range error for the returned subnormal number
> b) gfortran returned 0.0 as nearest number of 0.0, which is plainly wrong.
>
> To (a): With the current patch, only for NaN an error is printed; one
> might extend it to +/-INF if it is regarded as useful.
>
> To (b): The fix was done in three steps:
>
> 1. Reverting to Steve's old patch
> 2. Fixing the returned result using Steve's suggestion
> 3. Fixing rounding of subnormal numbers
>
> Thanks to Steve for the help! And to Paul Zimmermann, who send a similar
> suggestion as Steve's for (2).
>
> Build and regression tested on x86-64. OK for the trunk?
>
> Tobias
>
Tobias, this looks good. OK
> PS: Any idea how to test for INF and NAN? If I do "0.0/0.0" I get a
> compile-time error and -fno-range-check does not help. I cannot assign
> to a variable first as otherwise NEAREST is not evaluated at compile time.
>
You can write a value to a string and test for "NaN" or "Infinity". Its crude
but effective.
Jerry
More information about the Fortran
mailing list