How Math in JDK8 Detect Overflow


JDk8 add methods such as add/subtract/multiply/increment/decrement/Exact etc to throw ArithmeticException if it the result overflows.

The code:

public static long addExact(long x, long y) {
  long r = x + y;
  // HD 2-12 Overflow iff both arguments have the opposite sign of the result
  if (((x ^ r) & (y ^ r)) < 0) {
    throw new ArithmeticException("long overflow");
  }
  return r;
}

public static long subtractExact(long x, long y) {
  long r = x - y;
  // HD 2-12 Overflow iff the arguments have different signs and
  // the sign of the result is different than the sign of x
  if (((x ^ y) & (x ^ r)) < 0) {
    throw new ArithmeticException("long overflow");
  }
  return r;
}

public static int multiplyExact(int x, int y) {
  long r = (long)x * (long)y;
  if ((int)r != r) {
    throw new ArithmeticException("integer overflow");
  }
  return (int)r;
}
public static long multiplyExact(long x, long y) {
  long r = x * y;
  long ax = Math.abs(x);
  long ay = Math.abs(y);
  if (((ax | ay) >>> 31 != 0)) {
    // Some bits greater than 2^31 that might cause overflow
    // Check the result using the divide operator
    // and check for the special case of Long.MIN_VALUE * -1
    if (((y != 0) && (r / y != x)) ||
      (x == Long.MIN_VALUE && y == -1)) {
      throw new ArithmeticException("long overflow");
    }
  }
  return r;
}
public static long incrementExact(long a) {
  if (a == Long.MAX_VALUE) {
    throw new ArithmeticException("long overflow");
  }

  return a + 1L;
}
public static long negateExact(long a) {
  if (a == Long.MIN_VALUE) {
    throw new ArithmeticException("long overflow");
  }

  return -a;
}  
public static int floorDiv(int x, int y) {
  int r = x / y;
  // if the signs are different and modulo not zero, round down
  if ((x ^ y) < 0 && (r * y != x)) {
    r--;
  }
  return r;
}
Resources
Hacker's Delight
Hacker's Delight: The Basics
The Aggregate Magic Algorithms, 26 bit twiddling algorithms from Hank Dietz and others
Bit Twiddling Hacks, by Sean Anderson

Labels

adsense (5) Algorithm (69) Algorithm Series (35) Android (7) ANT (6) bat (8) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) Java (186) JavaScript (27) JSON (7) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) regex (5) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) xml (5)