From: | "Claudio Natoli" <claudio(dot)natoli(at)memetrics(dot)com> |
---|---|
To: | "Tom Lane" <tgl(at)sss(dot)pgh(dot)pa(dot)us>, "Merlin Moncure" <merlin(dot)moncure(at)rcsonline(dot)com> |
Cc: | <pgsql-hackers-win32(at)postgresql(dot)org> |
Subject: | Re: win32 random number generator |
Date: | 2005-08-23 05:13:42 |
Message-ID: | C9A33A2803C7F3479A02A333328A17471D3EC2@ewell.memetrics.local |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers-win32 |
Hello all,
Tom Lane writes:
> "Merlin Moncure" <merlin(dot)moncure(at)rcsonline(dot)com> writes:
> > Looks like this in lrand48(void):
> > //return ((long) _rand48_seed[2] << 15) + ((long)
> _rand48_seed[1] > 1);
>
> > is supposed to be this:
> > return (long)((unsigned long) _rand48_seed[2] << 15) +
> ((unsigned long)
> > _rand48_seed[1] >> 1);
>
> Hmm, _rand48_seed is unsigned short, so casting to either long or
> unsigned long should zero-extend, and then it doesn't matter whether
> the shifts think it's signed or not. In short, that shouldn't change
> the behavior unless your compiler is broken.
Yes, ISTM the unsigned long's are superfluous. The bug is that the first version has a typo, in that greater-than is applied to rand48_seed[1], when it means to do right-shift... which explains why we're seeing "just over" 16-bits of precision.
Cheers,
Claudio
From | Date | Subject | |
---|---|---|---|
Next Message | Merlin Moncure | 2005-08-23 12:14:21 | Re: win32 random number generator |
Previous Message | Tom Lane | 2005-08-22 21:32:39 | Re: win32 random number generator |