[DUG] Int64 or floating point faster?
Jolyon Smith
jsmith at deltics.co.nz
Mon Aug 18 08:47:01 NZST 2014
@Cameron, you appear to be confused.
Yes, Delphi uses a standard implementation of single and double types - the
IEEE standards. But I don't know where you got the idea that this standard
involves a naive pairing of two ints (of any size). Floating point types
are *far* more complex than that. e.g. the internal representation of the
value "1" in Double is not (0x00000001).(0x00000000) but
(0x3fff0000).(0x00000000)
How would I describe it otherwise ? Why, the same way that IEEE 754
describes it of course. ;)
http://en.wikipedia.org/wiki/Double-precision_floating-point_format
Single is similarly not a naive pairing of two int16's. In fact, the
closest I can even think that Delphi has to such a limited implementation
for decimal values is the Curreny type, but even that isn't a "pair of
integers", rather a straightforward "fixed point" with a scalar of 10,000,
yielding 4 fixed decimal places.
Back to the OP...
If you are using Delphi 7 and were thinking of using Single precision, then
I strongly recommend that you do some tests with some representative sample
data to establish the most efficient approach, but as a rule of thumb I
would expect to find that Single precision would be more efficient than
Double (and in the older.Win32 compilers I wouldn't be surprised if these
had an even greater performance advantage over Int64). The question then
is whether Single precision is adequate for your needs or if you need the
additional capacity of Double.
If you are inclined toward Int64 for some reason, be aware that there was a
bug in the Delphi Int64 arithmetic in older Delphi versions. The 32-bit
compiler doesn't use hardware op-codes for Int64 operations but emulates
these in software, which is why Int64 performs less well than Double:
I'm fairly sure this is the case even today (hence the comparative
performance of Double and Int64 even in the XE4 32-bit compiler), but
absolutely certain that it is the case with the older Delphi compilers.
The details of the bug escape my memory right now, other than that it was a
basic arithmetic error in the compiler emitted code (and something of an
edge case), rather than a bug in an RTL function. i.e. not something that
can be easily avoided.
But I am sure your tests will show that Single or Double are more efficient
anyway.
On 17 August 2014 20:09, Cameron Hart <Cameron.Hart at flowsoftware.co.nz>
wrote:
> I’m confused now as I’m pretty sure Delphi uses a standard format to
> represent float (the same format used anywhere else for that matter). In
> which case a float is essentially two int32 (or other int’s depending on
> the scale of the float). Ie a single used two int16.
>
>
>
> One int represented the mantissa the other the exponent (in essence the
> decimal portion). Together they resulted in the floating point value.
>
>
>
> How would you describe this otherwise?
>
>
>
>
>
> *From:* delphi-bounces at listserver.123.net.nz [mailto:
> delphi-bounces at listserver.123.net.nz] *On Behalf Of *Jolyon Smith
> *Sent:* Sunday, 17 August 2014 12:54 p.m.
>
> *To:* NZ Borland Developers Group - Delphi List
> *Subject:* Re: [DUG] Int64 or floating point faster?
>
>
>
> That's curious. Who are "they" ? It doesn't sound like any floating
> point implementation I ever came across in Delphi (or anywhere else, for
> that matter). O.o
>
>
>
> On 17 August 2014 12:28, Pieter De Wit <pieter at insync.za.net> wrote:
>
> Hi Jolyon,
>
> From memory, they used 2 int32's to make a float - this could have been
> int16's - memory is very vague on this :) The one was used to represent the
> whole numbers and the other was to show the decimal numbers
>
> Cheers,
>
> Pieter
>
>
>
> On 17/08/2014 12:05, Jolyon Smith wrote:
>
> @Pieter - I don't understand what you mean when you say that "float was
> int32.int32". For starters, "float" is an imprecise term. If you mean
> "single" then the entire value was always 32 bit in it's entirety. If you
> mean double then it was always 64 bit. What is this "in32.int32" type of
> which you speak ? O.o
>
>
>
> On 17 August 2014 11:52, Jolyon Smith <jsmith at deltics.co.nz> wrote:
>
> I think there are too many variables involved to give an answer to this
> question without some of those variables being reduced to known values.
>
> e.g. what hardware ? what version of Delphi ? x64 target or x86 ? what
> precision of floating point ?
>
> Having said that, in a quick test knocked up in my Smoketest framework I
> found that Double comfortably outperforms Int64 when compiling for Win32
> but that both Double and Int64 demonstrated improved performance when
> compiling for Win64 and that whilst Double still showed some advantage it
> was not as significant (and in some test runs the difference was
> negligible).
>
> If you are targeting FireMonkey you will have to bear in mind that the
> back-end compiler is different to the x86/x64 backend, so results obtained
> using the WinXX compilers will not necessarily be indicative of performance
> on the ARM or LLVM platforms.
>
>
>
> Conditions:
>
>
> - Delphi XE4
>
> - Running in a 64-bit Win 7 VM
>
> - No testing was done for correctness of the results.
>
>
>
>
>
>
>
> On 16 August 2014 15:30, Ross Levis <ross at stationplaylist.com> wrote:
>
> Would I be correct that int64 multiplications would be faster than
> floating point in Delphi? My app needs to do several million.
>
>
>
>
>
> _______________________________________________
> NZ Borland Developers Group - Delphi mailing list
> Post: delphi at listserver.123.net.nz
> Admin: http://delphi.org.nz/mailman/listinfo/delphi
> Unsubscribe: send an email to delphi-request at listserver.123.net.nz with
> Subject: unsubscribe
>
>
>
>
>
>
>
> _______________________________________________
>
> NZ Borland Developers Group - Delphi mailing list
>
> Post: delphi at listserver.123.net.nz
>
> Admin: http://delphi.org.nz/mailman/listinfo/delphi
>
> Unsubscribe: send an email to delphi-request at listserver.123.net.nz with Subject: unsubscribe
>
>
>
>
> _______________________________________________
> NZ Borland Developers Group - Delphi mailing list
> Post: delphi at listserver.123.net.nz
> Admin: http://delphi.org.nz/mailman/listinfo/delphi
> Unsubscribe: send an email to delphi-request at listserver.123.net.nz with
> Subject: unsubscribe
>
>
>
> _______________________________________________
> NZ Borland Developers Group - Delphi mailing list
> Post: delphi at listserver.123.net.nz
> Admin: http://delphi.org.nz/mailman/listinfo/delphi
> Unsubscribe: send an email to delphi-request at listserver.123.net.nz with
> Subject: unsubscribe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://listserver.123.net.nz/pipermail/delphi/attachments/20140818/e5b2ac74/attachment-0001.html
More information about the Delphi
mailing list