Alan Krause
2018-06-29 16:45:31 UTC
I stumbled upon something the other day that was causing numerical
differences between compiled Delphi and FPC code. Executing the following
sample console application illustrates the issue clearly:
program test;
uses
math, SysUtils;
var
arg1 : double;
arg2 : double;
res : double;
begin
arg1 := 100000.00;
arg2 := 72500.51;
writeln( 'arg1 = ' + FormatFloat( '0.00000000', arg1 ) );
writeln( 'arg2 = ' + FormatFloat( '0.00000000', arg2 ) );
res := arg1 - arg2;
writeln( 'arg1 - arg2 = ' + FormatFloat( '0.00000000', res ) );
writeln( 'Max( arg1 - arg2, 0 ) = ' + FormatFloat( '0.00000000', Max(
res, 0 ) ) );
writeln( 'Max( arg1 - arg2, 0.0 ) = ' + FormatFloat( '0.00000000', Max(
res, 0.0 ) ) );
end.
--- begin output (Linux x86_64) ---
arg1 = 100000.00000000
arg2 = 72500.51000000
arg1 - arg2 = 27499.49000000
*Max( res, 0 ) = 27499.49023438*
Max( res, 0.0 ) = 27499.49000000
--- end output ---
I am guessing that the integer value of zero is causing the wrong
overloaded function to be called? I was able to solve the problem in my
code by replacing the 0 with 0.0.
Thanks,
Alan
--
Alan Krause
*President @ Sherman & Associates, Inc.*
Office: (760) 634-1700 Web: https://www.shermanloan.com/
differences between compiled Delphi and FPC code. Executing the following
sample console application illustrates the issue clearly:
program test;
uses
math, SysUtils;
var
arg1 : double;
arg2 : double;
res : double;
begin
arg1 := 100000.00;
arg2 := 72500.51;
writeln( 'arg1 = ' + FormatFloat( '0.00000000', arg1 ) );
writeln( 'arg2 = ' + FormatFloat( '0.00000000', arg2 ) );
res := arg1 - arg2;
writeln( 'arg1 - arg2 = ' + FormatFloat( '0.00000000', res ) );
writeln( 'Max( arg1 - arg2, 0 ) = ' + FormatFloat( '0.00000000', Max(
res, 0 ) ) );
writeln( 'Max( arg1 - arg2, 0.0 ) = ' + FormatFloat( '0.00000000', Max(
res, 0.0 ) ) );
end.
--- begin output (Linux x86_64) ---
arg1 = 100000.00000000
arg2 = 72500.51000000
arg1 - arg2 = 27499.49000000
*Max( res, 0 ) = 27499.49023438*
Max( res, 0.0 ) = 27499.49000000
--- end output ---
I am guessing that the integer value of zero is causing the wrong
overloaded function to be called? I was able to solve the problem in my
code by replacing the 0 with 0.0.
Thanks,
Alan
--
Alan Krause
*President @ Sherman & Associates, Inc.*
Office: (760) 634-1700 Web: https://www.shermanloan.com/