Re: rounding problems

From: Craig Ringer <craig(at)postnewspapers(dot)com(dot)au>
To: Justin <justin(at)emproshunts(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: rounding problems
Date: 2008-05-12 21:26:46
Message-ID: 4828B616.5080108@postnewspapers.com.au
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Justin wrote:

> Craig Ringer wrote:

>> `double' in C++ refers to double precision floating point. `double' is
>> subject to all the usual fun with rational decimals being irrational
>> binary floats (and vice versa).

> Not according to MS specific if i'm reading it correctly
>
> *Microsoft Specific >*
>
> The double type contains 64 bits: 1 for sign, 11 for the exponent, and
> 52 for the mantissa. Its range is +/--1.7E308 with at least 15 digits of
> precision

I take it you're referring to:

http://msdn.microsoft.com/en-us/library/e02ya398(VS.80).aspx ?

See how it says "The format is similar to the float format...." ?

As you can see from:

http://msdn.microsoft.com/en-us/library/hd7199ke(VS.80).aspx

the `double' type is a binary floating point representation, just like
float. It just has a bigger exponent and a bigger mantissa, so it can
represent more extreme values and do so with more precision.

Being a binary floating point representation it's subject to all the
usual problems with comparison for equality, rounding oddities, etc.

Here's one of the many explanations out there on the 'net. I haven't
read this particular one, it's just a viable looking Google hit:

http://www.cprogramming.com/tutorial/floating_point/understanding_floating_point.html

By the way, there was at least a proposal for a numeric/decimal type for
C++0x . It doesn't seem to have made the cut.

http://209.85.173.104/search?q=cache:D0Iqhgz7X1QJ:www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2041.pdf+%22c%2B%2B0x%22+decimal+OR+numeric&hl=en&ct=clnk&cd=1&gl=au&client=firefox-a
http://en.wikipedia.org/wiki/C%2B%2B0x
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/

It looks like ISO C might adopt a decimal type or library though:

http://www2.hursley.ibm.com/decimal/

Note in particular the support in gcc 4.2 or newer.

There's also a library:

http://www2.hursley.ibm.com/decimal/dfpal/

that might be useful.

--
Craig Ringe

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Bruce Momjian 2008-05-12 21:30:48 Re: Making sure \timing is on
Previous Message Justin 2008-05-12 21:23:15 Re: rounding problems