Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #21564

Re: useful macros

From James Kuyper <jameskuyper@verizon.net>
Newsgroups comp.lang.c
Subject Re: useful macros
Date 2012-05-30 18:55 -0400
Organization A noiseless patient Spider
Message-ID <4FC6A57D.5050504@verizon.net> (permalink)
References (1 earlier) <467b41e9-3c51-4052-959f-061c17e4babc@pr3g2000pbb.googlegroups.com> <9461b5b5-79b4-422c-a50c-1b2915629009@googlegroups.com> <0.bd19cf1c61d059f4f743.20120530164534BST.87ipfdbrkx.fsf@bsb.me.uk> <4FC65479.7060004@verizon.net> <jq66o5$1gc$1@dont-email.me>

Show all headers | View raw


On 05/30/2012 06:24 PM, BartC wrote:
> "James Kuyper" <jameskuyper@verizon.net> wrote in message
> news:4FC65479.7060004@verizon.net...
>> On 05/30/2012 11:45 AM, Ben Bacarisse wrote:
> 
>>> The first is a little tricky.  If you insist on absolute uniformity and
>>> exactly the closed interval [0, 1-DBL_EPSILON], I'd have to work for
>>> more than a minute. ...
> 
>> I suspect you're thinking about a function which can produce every
>> representable number between 0 and nextafter(1.0, 0.0), with a uniform
>> probability distribution. I agree, that would take a lot more than one
>> minute to write up. However, I'd guess he was thinking of something
>> along the lines of
>>
>> #define uniform() (rand()/(1.0 + RAND_MAX))
>>
>> which can produce only RAND_MAX+1 different values, but those values can
>> be uniformly distributed if RAND_MAX+1 is an integer power of FLT_RADIX
>> and RAND_MAX*DBL_EPSILON < 1.0, which is often the case.
> 
> I use a function random(a..b) which returns a random integer from a to b
> inclusive (in a scripting language, but it calls C's rand()).
> 
> I've just tested this, and over a large number of calls, it seems to produce
> a uniform distribution down to 0.001% and better. (And it doesn't know what
> RAND_MAX is except that it might be as low as 32767.)
> 
> By choosing the range 0 to 999999 for example, then dividing the result by
> 1000000.0, that ought to produce a linear distribution over 0.000000 to 
> 0.999999. That definition seems quite adequate for many purposes. I don't 
> know whether you're thinking that there are more numbers between 0.25 and 
> 0.5, than between 0.5 and 1.0 for example, and this somehow needs to be 
> reflected in this distribution.

No, that's not usually a problem, because essentially all real-world
implementations of C have a FLT_RADIX which is a power of 2. However, on
any system where FLT_RADIX is not an integer multiple of 5, the number
of representable floating point values between 0.5 and 0.6 IS different
(usually by 1) from the number of representable values between 0.6 and
0.7. On such a system, (0.6 - 0.5) != (0.7 - 0.6). These differences are
small, and don't matter for most purposes, but in some contexts they can
have an affect that can be measured. The distribution is exactly uniform
only when there are no such differences.

More important for many purposes is the fact that you can generate only
RAND_MAX different floating point values that way. That can be quite
acceptable for many purposes, and completely unacceptable for others.
Between each consecutive pair of values that can be generated there's a
gap containing huge numbers of representable floating point values that
can never be generated. The gaps all have exactly the same size and are
all in phase with each other, which means they can have very noticeable
effects on certain kinds of numerical simulations, particularly in
Fourier analysis.

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

useful macros Malcolm McLean <malcolm.mclean5@btinternet.com> - 2012-05-26 13:08 -0700
  Re: useful macros winndy <jiaoyk@gmail.com> - 2012-05-29 20:26 -0700
    Re: useful macros Malcolm McLean <malcolm.mclean5@btinternet.com> - 2012-05-30 00:47 -0700
      Re: useful macros Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-05-30 16:45 +0100
        Re: useful macros James Kuyper <jameskuyper@verizon.net> - 2012-05-30 13:10 -0400
          Re: useful macros Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-05-30 21:54 +0100
          Re: useful macros "BartC" <bc@freeuk.com> - 2012-05-30 23:24 +0100
            Re: useful macros James Kuyper <jameskuyper@verizon.net> - 2012-05-30 18:55 -0400
              Re: useful macros "BartC" <bc@freeuk.com> - 2012-05-31 00:45 +0100
            Re: useful macros Keith Thompson <kst-u@mib.org> - 2012-05-30 17:53 -0700
              Re: useful macros "BartC" <bc@freeuk.com> - 2012-05-31 10:29 +0100

csiph-web