| [`Math.abs`](https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#abs-long-) |
| returns a negative number when called with the largest negative number. |
| |
| Example: |
| |
| ```java |
| int veryNegative = Math.abs(Integer.MIN_VALUE); |
| long veryNegativeLong = Math.abs(Long.MIN_VALUE); |
| ``` |
| |
| When trying to generate positive random numbers or fingerprints by using |
| `Math.abs` around a random positive-or-negative integer (or long), there will a |
| rare edge case where the returned value will be negative. |
| |
| This is because there is no positive integer with the same magnitude as |
| `Integer.MIN_VALUE`, which is equal to `-Integer.MAX_VALUE - 1`. Floating point |
| numbers don't suffer from this problem, as the sign is stored in a separate bit. |
| |
| Instead, one should use random number generation functions that are guaranteed |
| to generate positive numbers: |
| |
| ```java |
| Random r = new Random(); |
| int positiveNumber = r.nextInt(Integer.MAX_VALUE); |
| ``` |
| |
| or map negative numbers onto the non-negative range: |
| |
| ```java |
| long lng = r.nextLong(); |
| |
| long bestForHashCodes = lng & Long.MAX_VALUE; |
| long bestForMath = LongMath.saturatedAbs(lng); |
| ``` |