Malcolm McLean said:
בת×ריך ×™×•× ×¨×‘×™×¢×™, 30 במ××™ 2012 04:26:11 UTC+1, מ×ת winndy: ....
I write these macros and put them at the top of pure ANSI source files.
I didn't provide definitions because most regulars could easily write
these macros in under a minute.
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. ...
The wording is ambiguous; it could be interpreted as implying that the
macro takes an argument named 'epsilon'. If so, the result should
probably have the same type as 'epsilon', which would be the only reason
I can come up with why a macro would be more appropriate than a
function. The macro would have to use _Generic().
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.
Note: while 1 + DBL_EPSILON is, by definition, the same as
nextafter(1.0, 2.0), 1 - DBL_EPSILON need not be the same as
nextafter(1.0, 0.0), and usually won't be. The model for the
representation of floating point values described in 5.2.4.2.2 is not
mandatory; it's used solely for exposition of the requirements of that
section. However, if it's a sufficiently accurate description of the
actual representation of a double, then nextafter(1.0, 0.0) should be
1.0-DBL_EPSILON/FLT_RADIX.