On Thu, 19 Feb 2009 11:35:04 +0300, Don <nos...@nospam.com> wrote:
Benji Smith wrote:
Don wrote:
Andrei Alexandrescu wrote:
Benji Smith wrote:
Benji Smith wrote:
Maybe a NumericInterval struct would be a good idea. It could be
specialized to any numeric type (float, double, int, etc), it would
know its own boundaries, and it'd keep track of whether those
boundaries were open or closed.
The random functions would take an RND and an interval (with some
reasonable default intervals for common tasks like choosing
elements from arrays and random-access ranges).
I have a Java implementation around here somewhere that I could
port to D if anyone is interested.
--benji
Incidentally, the NumericInterval has lots of other interesting
applications. For example
auto i = NumericInterval.UBYTE.intersect(NumericInterval.SBYTE);
bool safelyPolysemious = i.contains(someByteValue);
auto array = new double[123];
auto i = NumericInterval.indexInterval(array);
bool indexIsLegal = i.contains(someIndex);
Using a numeric interval for generating random numbers would be, in
my opinion, totally ideal.
double d = uniform(NumericInterval.DOUBLE); // Any double value
I've never been in a situation in my life where I thought, hey, a
random double is exactly what I'd need right now. It's a ginormous
interval!
Andrei
It's worse than that. Since the range of double includes infinity, a
uniform distribution must return +-infinity with probability 1. It's
nonsense.
Way to miss the forest for the trees.
You guys telling me can't see any legitimate use for a NumericInterval
type? And that it wouldn't be convenient to use for random number
generation within that interval?
So the full double range was a dumb example. But that wasn't really
the point, was it?
--benji
On the contrary, I've been giving NumericInterval considerable thought.
One key issue is whether a NumericInterval(x1, x2) must satisfy x1 <= x2
(the _strict_ definition), or whether it is also permissible to have
x2<=x1 (ie, you can specify the two endpoints in reverse order; the
interval is then between min(x1,x2) and max(x1, x2)).
This is an issue because I've noticed is that when I want to use it, I
often have related pairs of values.
eg.
Suppose u is the interval {x1, x2}. There's a related v = {f(x1), f(x2)}.
Unfortunately although x1<=x2, f(x1) may not be <= f(x2). So v is not an
interval in the _strict_ sense. But it satisfies the _relaxed_
definition.
Same as NumericInterval's bounds ([],(),[),(]), strictness might be an
interval's template parameter.