JDK 21 | JDK 24 | JDK 25 |
---|---|---|
21.0.8-oracleFixed | 24.0.2Fixed | 25 b13Fixed |
Causes :
|
|
Relates :
|
|
Relates :
|
|
Relates :
|
JDK-8350430 :
|
|
JDK-8350431 :
|
ADDITIONAL SYSTEM INFORMATION : Windows 11 [Version 10.0.26100.2894] JDK 21.0.6, 23.0.2, 24-ea+35, 25-ea+8 A DESCRIPTION OF THE PROBLEM : Use numberOfLeadingZeros inside a short loop. Use arrays for input, output, or both. Access arrays sequentially. Do not use branching statements such as if statements within the loop. A certain number of loops (hundreds of thousands of times?). Under these conditions, it may return a number that is 1 less at the boundary where the value changes. Could the Intrinsic of Integer.numberOfLeadingZeros be causing the problem? 0x01FFFFFF: expected=7, actual=6 0x03FFFFFE-0x03FFFFFF: expected=6, actual=5 0x07FFFFFC-0x07FFFFFF: expected=5, actual=4 0x0FFFFFF8-0x0FFFFFFF: expected=4, actual=3 0x1FFFFFF0-0x1FFFFFFF: expected=3, actual=2 0x3FFFFFE0-0x3FFFFFFF: expected=2, actual=1 STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : var out = new int[0x2000004]; for (int i = 0; i < out.length; i++) out[i] = Integer.numberOfLeadingZeros(i); System.out.println(out[0x1FFFFFF]); ---------- BEGIN SOURCE ---------- public class Main { public static void main(String[] args) { arrayOutput(0x01000000, 0x02000004); arrayOutput(0x03000000, 0x04000004); arrayOutput(0x07000000, 0x08000004); arrayOutput(0x0F000000, 0x10000004); arrayOutput(0x1F000000, 0x20000004); arrayOutput(0x3F000000, 0x40000004); System.out.println(); for (int loop = 0; loop < 5; loop++) { arrayInput(0x200000); } } static void arrayOutput(int from, int to) { var output = new int[to - from]; for (int i = from; i < to; i++) { output[i - from] = Integer.numberOfLeadingZeros(i); } for (int i = from; i < to; i++) { int nlz = Integer.numberOfLeadingZeros(i); if (nlz != output[i - from]) { System.out.printf("0x%08X: expected=%d actual=%d%n", i, nlz, output[i - from]); } } } static void arrayInput(int size) { int expected = 0; for (int i = 0; i < size; i++) expected += Integer.numberOfLeadingZeros(-1 >>> i); var input = new int[size]; java.util.Arrays.setAll(input, i -> -1 >>> i); int actual = 0; for (int i = 0; i < size; i++) actual += Integer.numberOfLeadingZeros(input[i]); System.out.printf("expected=%d, actual=%d%n", expected, actual); } } ---------- END SOURCE ----------
|