Peter Eisentraut <[EMAIL PROTECTED]> writes:
> The GNU C library now offers a %a (and %A) format that prints floating
> point numbers in a semi-internal form that is meant to be portable.  (I
> image this was done because of C99, but I'm speculating.)  It might be
> useful to offer this to preserve accurate data across dumps.

Here's what I find in the C99 draft:

       a,A     A double argument representing a (finite)  floating-
               point    number    is   converted   in   the   style
               [-]0xh.hhhhp±d, where there is one hexadecimal digit
                           ^ ± == "+/-" ... tgl
               (which  is  nonzero  if the argument is a normalized
               floating-point number and is otherwise  unspecified)
               before   the  decimal-point  character (219) and the
               number of hexadecimal digits after it  is  equal  to
               the  precision;  if  the  precision  is  missing and
               FLT_RADIX is a power of 2,  then  the  precision  is
               sufficient for an exact representation of the value;
               if the precision is missing and FLT_RADIX is  not  a
               power  of  2,  then  the  precision is sufficient to
               distinguish (220) values of type double, except that
               trailing zeros may be omitted; if the  precision  is
               zero  and  the  # flag is not specified, no decimal-
               point character appears.   The  letters  abcdef  are
               used  for  a conversion and the letters ABCDEF for A
               conversion.  The A conversion specifier  produces  a
               number  with  X  and  P  instead  of  x  and p.  The
               exponent always contains at  least  one  digit,  and
               only  as  many more digits as necessary to represent
               the decimal exponent of 2.  If the  value  is  zero,
               the exponent is zero.

               A double argument representing an infinity or NaN is
               converted in the style  of  an  f  or  F  conversion
               specifier.

       ____________________

       219Binary  implementations  can choose the hexadecimal digit
          to the  left  of  the  decimal-point  character  so  that
          subsequent digits align to nibble (4-bit) boundaries.

       220The precision p is sufficient to  distinguish  values  of
          the source type if 16p-1>bn where b is FLT_RADIX and n is
          the number of base-b digits in  the  significand  of  the
          source  type.  A smaller p might suffice depending on the
          implementation's scheme for determining the digit to  the
          left of the decimal-point character.

       7.19.6.1                   Library                  7.19.6.1

       314          Committee Draft  --  August 3, 1998   WG14/N843


So, it looks like C99-compliant libc implementations will have this,
but I'd hesitate to rely on it for pg_dump purposes; it would certainly
not be very portable for awhile yet.

Peter's idea of a SET variable to control float display format might
not be a bad idea, but what if anything should pg_dump do with it?
Maybe just crank the precision up a couple digits from the current
defaults?

                        regards, tom lane

Reply via email to