On Sat, Jan 27, 2024 at 6:23 PM Thomas Kurz via fpc-pascal
<fpc-pascal@lists.freepascal.org> wrote:

> Hmmm... I don't think I can understand that. If the precision of "double" 
> were that bad, it wouldn't be possible to store dates up to a precision of 
> milliseconds in a TDateTime. I have a discrepancy of 40 seconds here.

Consider the following simplified program:
====
var
  tt: double;
  ee: extended;

begin
  tt := (8427 - Double(0.5)) + (12/ Double(24.0)) +
(33/Double(1440.0)) + (0/Double(86400.0));
  ee := (8427 - Extended(0.5)) + (12/ Extended(24.0)) +
(33/Extended(1440.0)) + (0/Extended(86400.0));
  writeln('tt=',tt:20:20);
  writeln('ee=',ee:20:20);
end.
===

Now see what it outputs:

C:\Users\Bart\LazarusProjecten\ConsoleProjecten>fpc test.pas
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
...

C:\Users\Bart\LazarusProjecten\ConsoleProjecten>test
tt=8427.02291666666680000000
ee=8427.02291666666666625000

C:\Users\Bart\LazarusProjecten\ConsoleProjecten>fpc -Px86_64 test.pas
Free Pascal Compiler version 3.2.2 [2021/05/15] for x86_64
..

C:\Users\Bart\LazarusProjecten\ConsoleProjecten>test
tt=8427.02291666666680000000
ee=8427.02291666666680000000

On Win64 both values are the same, because there Extended = Double.
On Win32 the Extended version is a bit closer to the exact solution:
8427 - 1/2 + 1/2 + 33/1440 = 8427 + 11/480

Simple as that.

Bart
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to