If you multiply the greatest value below 1.0 with someInt
(> 0), the result will never be someInt
.
This can be exhaustively tested for integers like this:
Double greatestLessThanOne = Double.longBitsToDouble(4607182418800017407L);
// Assert that greatestLessThanOne is indeed the largest double less than 1.
//assert 1.0 == greatestLessThanOne + Math.ulp(greatestLessThanOne);
for (int i = 1; i >= 0; i++)
if ((int) (greatestLessThanOne * i) == i)
System.out.println("Exception found: " + i);
The snippet produces no output.
(Math.ulp
returns the distance between the given double and the double value next larger in magnitude. The assertion thus ensures that greatestLessThanOne
is indeed the greatest value less than 1.0.)
In other words, your line
Object element = elementArray[(int)(Math.random() * elementArray.length)];
will never give rise to an ArrayIndexOutOfBoundsException.
Furthermore, according to Mark Dickinsons comment over here, this holds also when multiplying with a double.
With IEEE 754 floating-point arithmetic in round-to-nearest mode, you can show that x * y <
y for any x < 1.0
and any non-tiny positive y
. (It can fail if y
is either subnormal or the smallest positive normal number.)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…