[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