On Sun, 18 Feb 2024, James Richters via fpc-pascal wrote:
And if you have set the precision, then the calculation will be identical to
the calculation when you use a variable of the same type (if not, it's indeed a
bug).
This is what I have been trying to point out. Math with identical casting with
variables and constants are not the same.
Maybe if I try with a simpler example:
program Const_Vs_Var;
Const
A_const = Byte(1);
B_const = Single(3.5);
Var
A_Var : Byte;
B_Var : Single;
Const_Ans1, Var_Ans1 : Extended;
Begin
A_Var := A_Const;
B_Var := B_Const;
Const_Ans1 := Extended(Byte(A_Const)/Single(B_Const));
Var_Ans1 := Extended(Byte(A_Var)/Single(B_Var));
WRITELN ( ' Const_Ans1 = ', Const_Ans1);
WRITELN ( ' Var_Ans1 = ', Var_Ans1);
End.
Const_Ans1 = 2.85714298486709594727E-0001
Var_Ans1 = 2.85714285714285714282E-0001
Windows 10 Calculator shows the answer to be
0.28571428571428571428571428571429 Which matches up with the way variables
have done this math, not the way constants have done it.
I would not put too much trust in Windows calculator, since there you have
no control over the precision at all.
It seems to be a windows-specific problem. Here is the result of your
program when executed on Linux:
Const_Ans1 = 2.85714298486709594727E-0001
Var_Ans1 = 2.85714298486709594727E-0001
As you can see, the result is identifical.
As for the explanation, I will have to leave that to the compiler developers.
Michael.
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal