如果将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返回给定double和double值之间的距离,此距离随后在幅度上更大。因此,该断言确保
greatestLessThanOne确实是小于1.0的最大值。)
换句话说,你的线
Object element = elementArray[(int)(Math.random() * elementArray.length)];
永远不会引发ArrayIndexOutOfBoundsException。
此外,根据Mark Dickinsons在此处的评论,当乘以double时也是如此。
通过采用舍入至最接近模式的IEEE 754浮点运算,可以显示
x * y <yx <1.0以及任何非微小正数y。(如果y它是次普通数或最小的正普通数,则可能会失败。)



