Re: [HACKERS] regressin failure on latest CVS - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: [HACKERS] regressin failure on latest CVS
Date
Msg-id 200507231935.j6NJZZF24034@candle.pha.pa.us
Whole thread Raw
In response to Re: [HACKERS] regressin failure on latest CVS  ("Rocco Altier" <RoccoA@Routescape.com>)
Responses Re: [HACKERS] regressin failure on latest CVS
List pgsql-patches
Rocco Altier wrote:
> That still does not fix it for me.
>
> This patch is still using a computed float value (month_remainder and
> day_remainder), which is cauing the rounding errors.
>
> There are now 6 machines on the build farm that are failing from the
> rounding:
> Wallaroo (OSX/G4), asp(AIX/powerpc), viper(FC3/x86_64),
> platypus(FBSD/amd64), kookaburra(AIX/powerpc), oriole(FC4/x86).
>
> All of these are using enable-integer-datetimes.
>
> What was wrong with the patch I sent?  I am doing as much as I can with
> integer math.

OK, new patch, please test.  Yea, I know your patch works, but we
usually keep at it until we have a clean, understood solution.  Thanks.

---------------------------------------------------------------------------

>
>     -rocco
>
> > -----Original Message-----
> > From: Bruce Momjian [mailto:pgman@candle.pha.pa.us]
> > Sent: Saturday, July 23, 2005 2:51 PM
> > To: Rocco Altier
> > Cc: Michael Glaesemann; pgsql-patches@postgresql.org; ohp@pyrenet.fr
> > Subject: Re: [HACKERS] regressin failure on latest CVS
> >
> >
> >
> > Would you please try the attached patch and let me know if it
> > fixes the
> > problem?  I avoided accumulating into a float8.
> >
> > --------------------------------------------------------------
> > -------------
> >
> > Rocco Altier wrote:
> > > This still does not fix the problem.
> > >
> > > I had done my patch to try to mimic the way 8.0 had handled the math
> > > with the remainders, but to carry it over another bucket (day).
> > >
> > > The problem that I see is that we are taking day_remainder and
> > > multiplying by USECS_PER_DAY.  Which is a double * int64,
> > thus there is
> > > the precision loss there.
> > >
> > > I think initial division by the factor can't be helped, but
> > repeatedly
> > > doing more floating point math on with it is causing the
> > rounding error.
> > >
> > > Thanks,
> > >     -rocco
> > >
> > > > -----Original Message-----
> > > > From: Bruce Momjian [mailto:pgman@candle.pha.pa.us]
> > > > Sent: Saturday, July 23, 2005 10:54 AM
> > > > To: Rocco Altier
> > > > Cc: Michael Glaesemann; pgsql-patches@postgresql.org;
> > > > pgsql-hackers@postgresql.org; ohp@pyrenet.fr
> > > > Subject: Re: [HACKERS] regressin failure on latest CVS
> > > >
> > > >
> > > > Rocco Altier wrote:
> > > > > This patch fixes the interval regression on my AIX box
> > > > (kookaburra) by
> > > > > only doing integer math on the interval, instead of
> > > > float/double math.
> > > > >
> > > > > I think this is the correct way to handle this, since it's
> > > > an integer
> > > > > data type.
> > > > >
> > > > > I don't know if it will fix Olivier's problem, since I
> > > > wasn't able to
> > > > > reproduce it.
> > > > >
> > > >
> > > > I have changed the way I compute the remainder values ---
> > instead of
> > > > using multiplication, I use division and then subtraction.
> > > > This should
> > > > fix your rounding problem.  Looking at your fix, I don't see
> > > > how adding
> > > > USECS changes things because the factor is already a float,
> > > > but I think
> > > > the problem was more the way I was computing the remainders.
> > > >
> > > > Patch attached --- let me know if it does not fix your problem.
> > > >
> > > > --------------------------------------------------------------
> > >
> > >
> > > ---------------------------(end of
> > broadcast)---------------------------
> > > TIP 2: Don't 'kill -9' the postmaster
> > >
> >
> > --
> >   Bruce Momjian                        |  http://candle.pha.pa.us
> >   pgman@candle.pha.pa.us               |  (610) 359-1001
> >   +  If your life is a hard drive,     |  13 Roberts Road
> >   +  Christ can be your backup.        |  Newtown Square,
> > Pennsylvania 19073
> >
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: if posting/reading through Usenet, please send an appropriate
>        subscribe-nomail command to majordomo@postgresql.org so that your
>        message can get through to the mailing list cleanly
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/backend/utils/adt/timestamp.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v
retrieving revision 1.145
diff -c -c -r1.145 timestamp.c
*** src/backend/utils/adt/timestamp.c    23 Jul 2005 14:53:21 -0000    1.145
--- src/backend/utils/adt/timestamp.c    23 Jul 2005 19:34:39 -0000
***************
*** 2294,2300 ****
  {
      Interval   *span = PG_GETARG_INTERVAL_P(0);
      float8        factor = PG_GETARG_FLOAT8(1);
!     double        month_remainder, day_remainder;
      Interval   *result;

      result = (Interval *) palloc(sizeof(Interval));
--- 2294,2300 ----
  {
      Interval   *span = PG_GETARG_INTERVAL_P(0);
      float8        factor = PG_GETARG_FLOAT8(1);
!     double        month_remainder;
      Interval   *result;

      result = (Interval *) palloc(sizeof(Interval));
***************
*** 2308,2327 ****
      result->day = span->day / factor;
      result->time = span->time / factor;

-     /* Compute remainders */
-     month_remainder = span->month / factor - result->month;
-     day_remainder = span->day / factor - result->day;
-
      /* Cascade fractions to lower units */
!     /* fractional months full days into days */
      result->day += month_remainder * DAYS_PER_MONTH;
-     /* fractional months partial days into time */
-     day_remainder += (month_remainder * DAYS_PER_MONTH) - (int)(month_remainder * DAYS_PER_MONTH);

  #ifdef HAVE_INT64_TIMESTAMP
!     result->time += day_remainder * USECS_PER_DAY;
  #else
!     result->time += day_remainder * SECS_PER_DAY;
      result->time = JROUND(result->time);
  #endif

--- 2308,2327 ----
      result->day = span->day / factor;
      result->time = span->time / factor;

      /* Cascade fractions to lower units */
!     month_remainder = (span->month / factor - result->month);
      result->day += month_remainder * DAYS_PER_MONTH;

+     /* fractional months and partial days into time */
  #ifdef HAVE_INT64_TIMESTAMP
!     /* divide by 'factor' at the end to avoid rounding errors */
!     result->time += ((span->day - (int)(span->day * factor) +
!                     ((span->month - result->month * factor) * DAYS_PER_MONTH))
!                     * USECS_PER_DAY) / factor;
  #else
!     result->time += (span->day / factor - (int)(span->day / factor) +
!                     month_remainder * DAYS_PER_MONTH -
!                     (int)(month_remainder * DAYS_PER_MONTH)) * SECS_PER_DAY;
      result->time = JROUND(result->time);
  #endif


pgsql-patches by date:

Previous
From: "Rocco Altier"
Date:
Subject: Re: [HACKERS] regressin failure on latest CVS
Next
From: Bruce Momjian
Date:
Subject: Re: [HACKERS] regressin failure on latest CVS