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