Highest integer that fits in a Int64:

9223372036854775808

1e20:

100000000000000000000

 

Your Int is overflowing.

 

You can’t implement Frac by going through an Integer, that will never work. 
Except if you have an integer that can hold 1.8E308 (which would be a 1024 bit 
integer, or thereabouts).

 

From: fpc-devel <fpc-devel-boun...@lists.freepascal.org> On Behalf Of Sven 
Barth via fpc-devel
Sent: Friday, 27 April 2018 23:47
To: FPC developers' list <fpc-devel@lists.freepascal.org>
Cc: Sven Barth <pascaldra...@googlemail.com>
Subject: *** GMX Spamverdacht *** Re: [fpc-devel] Broken frac function in 
FPC3.1.1 / Windows x86_64

 

Bart <bartjun...@gmail.com <mailto:bartjun...@gmail.com> > schrieb am Fr., 27. 
Apr. 2018, 13:42:

On Wed, Apr 25, 2018 at 11:04 AM,  <i...@wolfgang-ehrhardt.de 
<mailto:i...@wolfgang-ehrhardt.de> > wrote:

> If you compile and run this 64-bit program on Win 64 you get a crash

And AFAICS your analysis of the cause (see bugtracker) is correct as well.

function fpc_frac_real(d: ValReal) : ValReal;compilerproc; assembler;
nostackframe;
  asm
    cvttsd2si %xmm0,%rax
    { Windows defines %xmm4 and %xmm5 as first non-parameter volatile registers;
      on SYSV systems all are considered as such, so use %xmm4 }
    cvtsi2sd %rax,%xmm4
    subsd %xmm4,%xmm0
  end;

CVTTSD2SI — Convert with Truncation Scalar Double-Precision
Floating-Point Value to Signed Integer
This should not be used to get a ValReal result.

 

The code essentially does the following (instruction by instruction):

 

=== code begin ===

 

tmpi := int64(d - trunc(d));

tmpd := double(tmpi);

Result := d - tmpd;

 

=== code end ===

 

Though why it fails with the given value is a different topic... 

 

Regards, 

Sven 

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to