[fpc-pascal] math with infinity and NaN

C Western l at c-m-w.me.uk
Wed Jun 20 10:03:04 CEST 2018


On 19/06/18 22:50, James Richters wrote:
> I’ve been updating my old programs to use the MATH unit in freepascal 
> and while testing things I came across a runtime error 217  Invalid 
> floating point operation.  Here is my test program
> 
> Uses math;
> 
> var
> 
>     variable1:double;
> 
>     variable2:double;
> 
> Begin
> 
> variable1:= Infinity;
> 
> variable2:= -1*Infinity;
> 
> Writeln(variable1,' ',Variable2,' ',Variable1+Variable2);
> 
> End.
> 
> My output is:
> 
> Running "i:\programming\test\testmath.exe "
> 
> An unhandled exception occurred at $004015F6:
> 
> EInvalidOp: Invalid floating point operation
> 
>    $004015F6  main,  line 8 of i:/programming/test/testmath.pas
> 
>                      +Inf                     -Inf
> 
> According to the link here: https://en.wikipedia.org/wiki/NaN
> 
> NaN should be produced:
> 
> The additions (+∞) + (−∞), (−∞) + (+∞) and equivalent subtractions (+∞) 
> − (+∞) and (−∞) − (−∞).
> 
> I can do things like +infinity*2 and +infinity-3 and even sqr(infinity) 
> and power(infinity,10) the results are still +Inf which is expected… 
>    but I can’t do anything involving subtracting infinity from 
> infinity.  Here is another test program that illustrates this more clearly:
> 
> Uses math;
> 
> var
> 
>     variable1:double;
> 
>     variable2:double;
> 
> Begin
> 
> variable1:= 1/0;
> 
> variable2:= -1/0;
> 
> Writeln('          V1',variable1);
> 
> Writeln('          V2',variable2);
> 
> Writeln('    SQRT(-1)',Sqrt(-1));
> 
> Writeln('       V1*V1',variable1*variable1);
> 
> Writeln('       V1*V2',variable1*variable2);
> 
> Writeln('        V1+3',variable1+3);
> 
> Writeln('       V1+V1',variable1+variable1);
> 
> Writeln('        V1-3',variable1-3);
> 
> Writeln('     Sqr(V1)',Sqr(Variable1));
> 
> Writeln('     Sqr(V2)',Sqr(Variable2));
> 
> Writeln('    Sqrt(-1)',Sqrt(-1));
> 
> Writeln('    Sqrt(V1)',Sqrt(Variable1));
> 
> Writeln('Power(V1,10)',Power(Variable1,10));
> 
> Writeln('     ABS(V2)',ABS(Variable2));
> 
> Writeln('    Sqrt(-1*V1)',Sqrt(-1*Variable1));//runtime error 217  
> Should be NAN
> 
> Writeln('    Sqrt(V2)',Sqrt(Variable2));      //runtime error 217  
> Should be NAN
> 
> Writeln('       V1-V1',variable1-variable1);  //runtime error 217  
> Should be NAN
> 
> Writeln('       V1+V2',variable1+variable2);  //runtime error 217  
> Should be NAN
> 
> End.
> 
> Running "i:\programming\test\testmath.exe "
> 
>            V1                    +Inf
> 
>            V2                    -Inf
> 
>      SQRT(-1)                          Nan
> 
>         V1*V1                    +Inf
> 
>         V1*V2                    -Inf
> 
>          V1+3                    +Inf
> 
>         V1+V1                    +Inf
> 
>          V1-3                    +Inf
> 
>       Sqr(V1)                    +Inf
> 
>       Sqr(V2)                    +Inf
> 
>      Sqrt(-1)                          Nan
> 
>      Sqrt(V1)                    +Inf
> 
> Power(V1,10)                         +Inf
> 
>       ABS(V2)                    +Inf
> 
> An unhandled exception occurred at $00401A43:
> 
> EInvalidOp: Invalid floating point operation
> 
>    $00401A43  main,  line 22 of I:/Programming/Test/testmath.pas
> 
>      Sqrt(-1*V1)
> 
> It seems to me that the whole purpose of +Inf, -Inf, and NaN was so you 
> could evaluate complex formulas and NOT get a runtime error… Is this 
> behavior just a bug that should be reported?  Testing was done with V3.0.4
> 
> James
> 
> 
> 
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
> 
My first reaction is that
SetExceptionMask([exDenormalized,exZeroDivide,exOverflow,exUnderflow,exPrecision])
would be required (I can't remember what the default is), but it doesn't 
stop the error (x86_64/linux). I suspect a bug, though I am slightly 
surprised it hasn't surfaced before.

Colin



More information about the fpc-pascal mailing list