Thread: [HACKERS] random_fract and aix compiler bug
Hi Peter, While fighting with a compiler bug here, I came across the following code, that loops here (on AIX 4.3.2) due to a compiler bug, presumably with the z < MAX_RANDOM_VALUE (it even warns at compile time): static double random_fract(void) { long z; /* random() can produce endpoint values, try again if so */ do { z = random(); } while (!(z > 0 && z < MAX_RANDOM_VALUE)); return (double) z / (double) MAX_RANDOM_VALUE; } Since you where the last to commit on analyze.c I send you this mail, since my mails currently don't pass some filter on postgresql.org I have attached a patch as a workaround for this silly compiler bug. Please consider to apply, Thanks Andreas
Attachment
"Zeugswetter Andreas SB SD" <ZeugswetterA@spardat.at> writes: ! } while (!(z > 0 && z < MAX_RANDOM_VALUE)); ! } while (z == 0 || z == MAX_RANDOM_VALUE); This seems fairly ugly, since it eliminates the original coding's positive guarantee that the final result is in 0 < x < 1. Does your compiler manage not to choke if we add a cast instead? } while (!(z > 0 && z < (long) MAX_RANDOM_VALUE)); regards, tom lane
Tom Lane wrote: >"Zeugswetter Andreas SB SD" <ZeugswetterA@spardat.at> writes: > >! } while (!(z > 0 && z < MAX_RANDOM_VALUE)); > >! } while (z == 0 || z == MAX_RANDOM_VALUE); > >This seems fairly ugly, since it eliminates the original coding's >positive guarantee that the final result is in 0 < x < 1. Does your >compiler manage not to choke if we add a cast instead? > > } while (!(z > 0 && z < (long) MAX_RANDOM_VALUE)); > > > Or put an "L" suffix on the value in pg_config_manual.h, so it gets picked up everywhere? cheers andrew
> ! } while (!(z > 0 && z < MAX_RANDOM_VALUE)); > > ! } while (z == 0 || z == MAX_RANDOM_VALUE); > > This seems fairly ugly, since it eliminates the original coding's > positive guarantee that the final result is in 0 < x < 1. Does your yes, ugly :-( > compiler manage not to choke if we add a cast instead? > > } while (!(z > 0 && z < (long) MAX_RANDOM_VALUE)); > this does unfortunately not help, have also tried all sorts of other casts :-( Would we be happy with the following, which would work ? } while (z <= 0 || z == MAX_RANDOM_VALUE); Andreas
"Zeugswetter Andreas SB SD" <ZeugswetterA@spardat.at> writes: > Would we be happy with the following, which would work ? > } while (z <= 0 || z == MAX_RANDOM_VALUE); I suppose this doesn't? } while (z <= 0 || z >= MAX_RANDOM_VALUE); regards, tom lane
> > Would we be happy with the following, which would work ? > > } while (z <= 0 || z == MAX_RANDOM_VALUE); > > I suppose this doesn't? > } while (z <= 0 || z >= MAX_RANDOM_VALUE); Ah, yes ! That also works and is a lot nicer. Can you please apply ? Together with the patch in Bruce's queue, the only minor open issue is now with the -i switch for postmaster in the getaddrinfo_all area (on this machine a direct nameservice request answers "host not found"), and the geometry and horology regression expected files. Thanks Andreas
"Zeugswetter Andreas SB SD" <ZeugswetterA@spardat.at> writes: >> } while (z <= 0 || z >= MAX_RANDOM_VALUE); > Ah, yes ! That also works and is a lot nicer. Can you please apply ? Done. regards, tom lane