Ответ 1
Если вы умножаете наибольшее значение ниже 1.0 с someInt
( > 0), результат никогда не будет someInt
.
Это может быть исчерпывающе проверено на такие целые числа:
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);
Отрывок не выводит.
(Math.ulp
возвращает расстояние между данным двойным и двойным значением, которое больше по величине. Таким образом, это утверждение гарантирует, что greatestLessThanOne
действительно самое большое значение меньше 1.0.)
Другими словами, ваша строка
Object element = elementArray[(int)(Math.random() * elementArray.length)];
никогда не приведет к исключению ArrayIndexOutOfBoundsException.
Кроме того, согласно комментарию Марка Дикинсона здесь, это также относится к умножению на двойной.
С помощью арифметики с плавающей запятой IEEE 754 в режиме "круглый" мы можем показать, что
x * y <
y для любогоx < 1.0
и любого не-маленького положительногоy
. (Он может терпеть неудачу, еслиy
является либо субнормальным, либо наименьшим положительным нормальным числом.)