[fpc-pascal] Loss of precision when using math.Max()

gtt at wolfgang-ehrhardt.de gtt at wolfgang-ehrhardt.de
Tue Jul 3 19:42:31 CEST 2018


Zitat von Vojtěch Čihák <vojtech.cihak at atlas.cz>:
> will not give any warning even if correct result is 2.5.
> It is simply absurd because it is not about shooting your own foot.  
> Compiler is not a crystal ball, it does what you tell him.
> If you need floating point, use floating point types and floating  
> point division (my example) and if you need signed results, use

Really?

There are other source of loss of precision (in the trunk version) and  
the compiler does
not what I tell him. Example:

const
   d1: double = 1.0/3.0;
   d2: double = 1/3;
   x1: extended = 1.0/3.0;
   x2: extended = 1/3;
   s1: single   = 1.0/3.0;
   s2: single   = 1/3;
begin
   writeln(s1:30:10,  s2:30:10);
   writeln(d1:30:16,  d2:30:16);
   writeln(x1:30:16,  x2:30:16);
end.

and the result

                   0.3333333433                  0.3333333433
             0.3333333432674408            0.3333333333333333
             0.3333333432674408            0.3333333333333333

The single result is expected. But the  double and extended constants  
d1, x1 are
evaluated as single, even if I told the compiler to use the floating  
point quotient 1.0/3.0.

If I use the integer quotient the values are as expected. This is  
against intuition and gives
no warning. And even if I can adapt to this and live with this quirk:  
Is there a definite
statement, that is will remain so. (Delphi works as expected).





More information about the fpc-pascal mailing list