An issue recently popped up that I thought I'd bring up as a potential issue. In short, if you call the Max() function with an integer and a double parameter (such as d := Max( 0, d ) ), then fpc appears to be using the Max( single, single ) overloaded function instead of Max( double, double ). This is causing a loss of precision once the double values get large enough. Here is a sample program which illustrates the issue:
program project1; uses Math , SysUtils ; var d : Double; s : Single; begin d := 159279.49; writeln( '159279.49 stored in Double d = ' + FloatToStr( d ) ); d := Max( 0, d ); writeln( 'Max( 0, d ) stored in Double d = ' + FloatToStr( d ) ); writeln(); s := 159279.49; writeln( '159279.49 stored in Single s = ' + FloatToStr( s ) ); s := Max( 0, s ); writeln( 'Max( 0, s ) stored in Single s = ' + FloatToStr( s ) ); writeln(); d := s; writeln( 'Assigning the value of s to Double d = ' + FloatToStr( d ) ); end. Doing a bit of research on this issue, I see that it was brought up on Stack Overflow back in 2018 here <https://stackoverflow.com/questions/52020129/unexpected-result-from-max-function-in-freepascal>. We can work around the issue by sending in 0 as 0.0, which then calls the correct Max( double, double ) function. Cheers, Alan
_______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal