[`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);
```
