[ 
http://issues.apache.org/jira/browse/MATH-154?page=comments#action_12425314 ] 
            
Remi Arntzen commented on MATH-154:
-----------------------------------

a better implementation:

long addAndCheck(long a, long b) {
    long max = Math.max(a, b);
    long min = Math.min(a, b);
    long sum = a + b;
    String overflow = "Overflow: add";
    if (max == 0 || min == 0) (
        return sum;
    } else if (max > 0 && min > 0) {
        if (Long.MAX_VALUE - max < min) {
            throw new RuntimeException(overflow);
        }
    } else if (max < 0 && min < 0) {
        if (Long.MIN_VALUE - min < max) {
            throw new RuntimeException(overflow);
        }
    } else {
        return sum;
    }
}

long subAndCheck(long a, long b) {
    long max = Math.max(a, b);
    long min = Math.min(a, b);
    long diff = a - b;
    String overflow = "Overflow: add";
    if (max == 0 || min == 0) {
        return diff;
    } else if (max > 0 && min < 0) {
        if (max == a) {
            if (max - Long.MAX_VALUE > min) {
                throw new RuntimeException(overflow);
            }
        } else if (max == b) {
            if (min - Long.MIN_VALUE < max) {
                throw new RuntimeException(overflow);
            }
        }
    } else {
        return sum;
    }
}


> MathUtils addAndCheck and subAndCheck for long values
> -----------------------------------------------------
>
>                 Key: MATH-154
>                 URL: http://issues.apache.org/jira/browse/MATH-154
>             Project: Commons Math
>          Issue Type: Improvement
>    Affects Versions: Nightly Builds, 1.1 Final
>            Reporter: Remi Arntzen
>
> public static long addAndCheck(long x, long y) {
>     BigInteger s = BigInteger.valueOf(x).add(BigInteger.valueOf(y);
>     if (s.bitLength() + 1 > Long.SIZE) {
>         throw new ArithmeticException("overflow: add");
>     }
>     return s.longValue();
> }
> public static long subAndCheck(long x, long y) {
>     BigInteger s = BigInteger.valueOf(x).subtract(BigInteger.valueOf(y));
>     if (s.bitLength() + 1 > Long.SIZE) {
>         throw new ArithmeticException("overflow: add");
>     }
>     return s.longValue();
> }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to