11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.math; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkArgument; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.DoubleUtils.IMPLICIT_BIT; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.DoubleUtils.SIGNIFICAND_BITS; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.DoubleUtils.getSignificand; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.DoubleUtils.isFinite; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.DoubleUtils.isNormal; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.DoubleUtils.scaleNormalize; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathPreconditions.checkInRange; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathPreconditions.checkNonNegative; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathPreconditions.checkRoundingUnnecessary; 297dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static java.lang.Math.abs; 303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport static java.lang.Math.copySign; 313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport static java.lang.Math.getExponent; 327dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static java.lang.Math.log; 337dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static java.lang.Math.rint; 347dd252788645e940eada959bdde927426e2531c9Paul Duffin 350888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.GwtCompatible; 360888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.GwtIncompatible; 377dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.VisibleForTesting; 387dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.primitives.Booleans; 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.BigInteger; 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.RoundingMode; 420888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Iterator; 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A class for arithmetic on doubles that is not covered by {@link java.lang.Math}. 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 500888a09821a98ac0680fad765217302858e70fa4Paul Duffin@GwtCompatible(emulated = true) 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic final class DoubleMath { 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * This method returns a value y such that rounding y DOWN (towards zero) gives the same result 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * as rounding x according to the specified mode. 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("#isMathematicalInteger, com.google.common.math.DoubleUtils") 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static double roundIntermediate(double x, RoundingMode mode) { 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!isFinite(x)) { 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new ArithmeticException("input is infinite or NaN"); 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert switch (mode) { 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case UNNECESSARY: 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkRoundingUnnecessary(isMathematicalInteger(x)); 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return x; 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case FLOOR: 677dd252788645e940eada959bdde927426e2531c9Paul Duffin if (x >= 0.0 || isMathematicalInteger(x)) { 687dd252788645e940eada959bdde927426e2531c9Paul Duffin return x; 697dd252788645e940eada959bdde927426e2531c9Paul Duffin } else { 707dd252788645e940eada959bdde927426e2531c9Paul Duffin return x - 1.0; 717dd252788645e940eada959bdde927426e2531c9Paul Duffin } 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case CEILING: 747dd252788645e940eada959bdde927426e2531c9Paul Duffin if (x <= 0.0 || isMathematicalInteger(x)) { 757dd252788645e940eada959bdde927426e2531c9Paul Duffin return x; 767dd252788645e940eada959bdde927426e2531c9Paul Duffin } else { 777dd252788645e940eada959bdde927426e2531c9Paul Duffin return x + 1.0; 787dd252788645e940eada959bdde927426e2531c9Paul Duffin } 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case DOWN: 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return x; 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case UP: 847dd252788645e940eada959bdde927426e2531c9Paul Duffin if (isMathematicalInteger(x)) { 857dd252788645e940eada959bdde927426e2531c9Paul Duffin return x; 867dd252788645e940eada959bdde927426e2531c9Paul Duffin } else { 873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return x + Math.copySign(1.0, x); 887dd252788645e940eada959bdde927426e2531c9Paul Duffin } 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case HALF_EVEN: 917dd252788645e940eada959bdde927426e2531c9Paul Duffin return rint(x); 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 937dd252788645e940eada959bdde927426e2531c9Paul Duffin case HALF_UP: { 947dd252788645e940eada959bdde927426e2531c9Paul Duffin double z = rint(x); 957dd252788645e940eada959bdde927426e2531c9Paul Duffin if (abs(x - z) == 0.5) { 967dd252788645e940eada959bdde927426e2531c9Paul Duffin return x + copySign(0.5, x); 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 987dd252788645e940eada959bdde927426e2531c9Paul Duffin return z; 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1007dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1027dd252788645e940eada959bdde927426e2531c9Paul Duffin case HALF_DOWN: { 1037dd252788645e940eada959bdde927426e2531c9Paul Duffin double z = rint(x); 1047dd252788645e940eada959bdde927426e2531c9Paul Duffin if (abs(x - z) == 0.5) { 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return x; 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 1077dd252788645e940eada959bdde927426e2531c9Paul Duffin return z; 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1097dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert default: 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new AssertionError(); 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1157dd252788645e940eada959bdde927426e2531c9Paul Duffin 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the {@code int} value that is equal to {@code x} rounded with the specified rounding 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * mode, if possible. 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws ArithmeticException if 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <ul> 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>{@code x} is infinite or NaN 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>{@code x}, after being rounded to a mathematical integer using the specified 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * rounding mode, is either less than {@code Integer.MIN_VALUE} or greater than {@code 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Integer.MAX_VALUE} 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>{@code x} is not a mathematical integer and {@code mode} is 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link RoundingMode#UNNECESSARY} 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * </ul> 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("#roundIntermediate") 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static int roundToInt(double x, RoundingMode mode) { 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double z = roundIntermediate(x, mode); 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkInRange(z > MIN_INT_AS_DOUBLE - 1.0 & z < MAX_INT_AS_DOUBLE + 1.0); 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (int) z; 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final double MIN_INT_AS_DOUBLE = -0x1p31; 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final double MAX_INT_AS_DOUBLE = 0x1p31 - 1.0; 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the {@code long} value that is equal to {@code x} rounded with the specified rounding 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * mode, if possible. 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws ArithmeticException if 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <ul> 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>{@code x} is infinite or NaN 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>{@code x}, after being rounded to a mathematical integer using the specified 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * rounding mode, is either less than {@code Long.MIN_VALUE} or greater than {@code 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Long.MAX_VALUE} 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>{@code x} is not a mathematical integer and {@code mode} is 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link RoundingMode#UNNECESSARY} 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * </ul> 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("#roundIntermediate") 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static long roundToLong(double x, RoundingMode mode) { 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double z = roundIntermediate(x, mode); 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkInRange(MIN_LONG_AS_DOUBLE - z < 1.0 & z < MAX_LONG_AS_DOUBLE_PLUS_ONE); 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (long) z; 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final double MIN_LONG_AS_DOUBLE = -0x1p63; 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * We cannot store Long.MAX_VALUE as a double without losing precision. Instead, we store 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Long.MAX_VALUE + 1 == -Long.MIN_VALUE, and then offset all comparisons by 1. 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final double MAX_LONG_AS_DOUBLE_PLUS_ONE = 0x1p63; 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the {@code BigInteger} value that is equal to {@code x} rounded with the specified 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * rounding mode, if possible. 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws ArithmeticException if 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <ul> 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>{@code x} is infinite or NaN 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>{@code x} is not a mathematical integer and {@code mode} is 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link RoundingMode#UNNECESSARY} 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * </ul> 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1790888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("#roundIntermediate, java.lang.Math.getExponent, " 1800888a09821a98ac0680fad765217302858e70fa4Paul Duffin + "com.google.common.math.DoubleUtils") 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static BigInteger roundToBigInteger(double x, RoundingMode mode) { 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert x = roundIntermediate(x, mode); 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (MIN_LONG_AS_DOUBLE - x < 1.0 & x < MAX_LONG_AS_DOUBLE_PLUS_ONE) { 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return BigInteger.valueOf((long) x); 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int exponent = getExponent(x); 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert long significand = getSignificand(x); 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigInteger result = BigInteger.valueOf(significand).shiftLeft(exponent - SIGNIFICAND_BITS); 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (x < 0) ? result.negate() : result; 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns {@code true} if {@code x} is exactly equal to {@code 2^k} for some finite integer 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code k}. 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("com.google.common.math.DoubleUtils") 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static boolean isPowerOfTwo(double x) { 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return x > 0.0 && isFinite(x) && LongMath.isPowerOfTwo(getSignificand(x)); 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the base 2 logarithm of a double value. 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Special cases: 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <ul> 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>If {@code x} is NaN or less than zero, the result is NaN. 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>If {@code x} is positive infinity, the result is positive infinity. 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>If {@code x} is positive or negative zero, the result is negative infinity. 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * </ul> 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2117dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>The computed result is within 1 ulp of the exact result. 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>If the result of this method will be immediately rounded to an {@code int}, 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #log2(double, RoundingMode)} is faster. 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static double log2(double x) { 2177dd252788645e940eada959bdde927426e2531c9Paul Duffin return log(x) / LN_2; // surprisingly within 1 ulp according to tests 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2207dd252788645e940eada959bdde927426e2531c9Paul Duffin private static final double LN_2 = log(2); 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the base 2 logarithm of a double value, rounded with the specified rounding mode to an 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code int}. 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Regardless of the rounding mode, this is faster than {@code (int) log2(x)}. 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IllegalArgumentException if {@code x <= 0.0}, {@code x} is NaN, or {@code x} is 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * infinite 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2310888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("java.lang.Math.getExponent, com.google.common.math.DoubleUtils") 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("fallthrough") 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static int log2(double x, RoundingMode mode) { 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkArgument(x > 0.0 && isFinite(x), "x must be positive and finite"); 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int exponent = getExponent(x); 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!isNormal(x)) { 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return log2(x * IMPLICIT_BIT, mode) - SIGNIFICAND_BITS; 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Do the calculation on a normal value. 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // x is positive, finite, and normal 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean increment; 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert switch (mode) { 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case UNNECESSARY: 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkRoundingUnnecessary(isPowerOfTwo(x)); 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // fall through 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case FLOOR: 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert increment = false; 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert break; 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case CEILING: 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert increment = !isPowerOfTwo(x); 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert break; 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case DOWN: 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert increment = exponent < 0 & !isPowerOfTwo(x); 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert break; 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case UP: 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert increment = exponent >= 0 & !isPowerOfTwo(x); 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert break; 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case HALF_DOWN: 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case HALF_EVEN: 2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case HALF_UP: 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double xScaled = scaleNormalize(x); 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // sqrt(2) is irrational, and the spec is relative to the "exact numerical result," 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // so log2(x) is never exactly exponent + 0.5. 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert increment = (xScaled * xScaled) > 2.0; 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert break; 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert default: 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new AssertionError(); 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return increment ? exponent + 1 : exponent; 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns {@code true} if {@code x} represents a mathematical integer. 2747dd252788645e940eada959bdde927426e2531c9Paul Duffin * 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This is equivalent to, but not necessarily implemented as, the expression {@code 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * !Double.isNaN(x) && !Double.isInfinite(x) && x == Math.rint(x)}. 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2780888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("java.lang.Math.getExponent, com.google.common.math.DoubleUtils") 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static boolean isMathematicalInteger(double x) { 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return isFinite(x) 2810888a09821a98ac0680fad765217302858e70fa4Paul Duffin && (x == 0.0 || 2820888a09821a98ac0680fad765217302858e70fa4Paul Duffin SIGNIFICAND_BITS - Long.numberOfTrailingZeros(getSignificand(x)) <= getExponent(x)); 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns {@code n!}, that is, the product of the first {@code n} positive 2873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * integers, {@code 1} if {@code n == 0}, or {@code n!}, or 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link Double#POSITIVE_INFINITY} if {@code n! > Double.MAX_VALUE}. 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The result is within 1 ulp of the true value. 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IllegalArgumentException if {@code n < 0} 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static double factorial(int n) { 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNonNegative("n", n); 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (n > MAX_FACTORIAL) { 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Double.POSITIVE_INFINITY; 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Multiplying the last (n & 0xf) values into their own accumulator gives a more accurate 3007dd252788645e940eada959bdde927426e2531c9Paul Duffin // result than multiplying by everySixteenthFactorial[n >> 4] directly. 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double accum = 1.0; 3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 1 + (n & ~0xf); i <= n; i++) { 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert accum *= i; 3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3057dd252788645e940eada959bdde927426e2531c9Paul Duffin return accum * everySixteenthFactorial[n >> 4]; 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @VisibleForTesting 3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static final int MAX_FACTORIAL = 170; 3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @VisibleForTesting 3130888a09821a98ac0680fad765217302858e70fa4Paul Duffin static final double[] everySixteenthFactorial = { 3140888a09821a98ac0680fad765217302858e70fa4Paul Duffin 0x1.0p0, 3150888a09821a98ac0680fad765217302858e70fa4Paul Duffin 0x1.30777758p44, 3160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 0x1.956ad0aae33a4p117, 3170888a09821a98ac0680fad765217302858e70fa4Paul Duffin 0x1.ee69a78d72cb6p202, 3180888a09821a98ac0680fad765217302858e70fa4Paul Duffin 0x1.fe478ee34844ap295, 3190888a09821a98ac0680fad765217302858e70fa4Paul Duffin 0x1.c619094edabffp394, 3200888a09821a98ac0680fad765217302858e70fa4Paul Duffin 0x1.3638dd7bd6347p498, 3210888a09821a98ac0680fad765217302858e70fa4Paul Duffin 0x1.7cac197cfe503p605, 3220888a09821a98ac0680fad765217302858e70fa4Paul Duffin 0x1.1e5dfc140e1e5p716, 3230888a09821a98ac0680fad765217302858e70fa4Paul Duffin 0x1.8ce85fadb707ep829, 3240888a09821a98ac0680fad765217302858e70fa4Paul Duffin 0x1.95d5f3d928edep945}; 3257dd252788645e940eada959bdde927426e2531c9Paul Duffin 3267dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 3277dd252788645e940eada959bdde927426e2531c9Paul Duffin * Returns {@code true} if {@code a} and {@code b} are within {@code tolerance} of each other. 3287dd252788645e940eada959bdde927426e2531c9Paul Duffin * 3297dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>Technically speaking, this is equivalent to 3307dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@code Math.abs(a - b) <= tolerance || Double.valueOf(a).equals(Double.valueOf(b))}. 3317dd252788645e940eada959bdde927426e2531c9Paul Duffin * 3327dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>Notable special cases include: 3337dd252788645e940eada959bdde927426e2531c9Paul Duffin * <ul> 3347dd252788645e940eada959bdde927426e2531c9Paul Duffin * <li>All NaNs are fuzzily equal. 3357dd252788645e940eada959bdde927426e2531c9Paul Duffin * <li>If {@code a == b}, then {@code a} and {@code b} are always fuzzily equal. 3367dd252788645e940eada959bdde927426e2531c9Paul Duffin * <li>Positive and negative zero are always fuzzily equal. 3377dd252788645e940eada959bdde927426e2531c9Paul Duffin * <li>If {@code tolerance} is zero, and neither {@code a} nor {@code b} is NaN, then 3387dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@code a} and {@code b} are fuzzily equal if and only if {@code a == b}. 3397dd252788645e940eada959bdde927426e2531c9Paul Duffin * <li>With {@link Double#POSITIVE_INFINITY} tolerance, all non-NaN values are fuzzily equal. 3407dd252788645e940eada959bdde927426e2531c9Paul Duffin * <li>With finite tolerance, {@code Double.POSITIVE_INFINITY} and {@code 3417dd252788645e940eada959bdde927426e2531c9Paul Duffin * Double.NEGATIVE_INFINITY} are fuzzily equal only to themselves. 3427dd252788645e940eada959bdde927426e2531c9Paul Duffin * </li> 3437dd252788645e940eada959bdde927426e2531c9Paul Duffin * 3447dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>This is reflexive and symmetric, but <em>not</em> transitive, so it is <em>not</em> an 3457dd252788645e940eada959bdde927426e2531c9Paul Duffin * equivalence relation and <em>not</em> suitable for use in {@link Object#equals} 3467dd252788645e940eada959bdde927426e2531c9Paul Duffin * implementations. 3477dd252788645e940eada959bdde927426e2531c9Paul Duffin * 3487dd252788645e940eada959bdde927426e2531c9Paul Duffin * @throws IllegalArgumentException if {@code tolerance} is {@code < 0} or NaN 3497dd252788645e940eada959bdde927426e2531c9Paul Duffin * @since 13.0 3507dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 3517dd252788645e940eada959bdde927426e2531c9Paul Duffin public static boolean fuzzyEquals(double a, double b, double tolerance) { 3527dd252788645e940eada959bdde927426e2531c9Paul Duffin MathPreconditions.checkNonNegative("tolerance", tolerance); 3530888a09821a98ac0680fad765217302858e70fa4Paul Duffin return 3543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Math.copySign(a - b, 1.0) <= tolerance 3550888a09821a98ac0680fad765217302858e70fa4Paul Duffin // copySign(x, 1.0) is a branch-free version of abs(x), but with different NaN semantics 3560888a09821a98ac0680fad765217302858e70fa4Paul Duffin || (a == b) // needed to ensure that infinities equal themselves 3570888a09821a98ac0680fad765217302858e70fa4Paul Duffin || (Double.isNaN(a) && Double.isNaN(b)); 3587dd252788645e940eada959bdde927426e2531c9Paul Duffin } 3597dd252788645e940eada959bdde927426e2531c9Paul Duffin 3607dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 3617dd252788645e940eada959bdde927426e2531c9Paul Duffin * Compares {@code a} and {@code b} "fuzzily," with a tolerance for nearly-equal values. 3627dd252788645e940eada959bdde927426e2531c9Paul Duffin * 3637dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>This method is equivalent to 3647dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@code fuzzyEquals(a, b, tolerance) ? 0 : Double.compare(a, b)}. In particular, like 3657dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@link Double#compare(double, double)}, it treats all NaN values as equal and greater than all 3667dd252788645e940eada959bdde927426e2531c9Paul Duffin * other values (including {@link Double#POSITIVE_INFINITY}). 3677dd252788645e940eada959bdde927426e2531c9Paul Duffin * 3687dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>This is <em>not</em> a total ordering and is <em>not</em> suitable for use in 3697dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@link Comparable#compareTo} implementations. In particular, it is not transitive. 3707dd252788645e940eada959bdde927426e2531c9Paul Duffin * 3717dd252788645e940eada959bdde927426e2531c9Paul Duffin * @throws IllegalArgumentException if {@code tolerance} is {@code < 0} or NaN 3727dd252788645e940eada959bdde927426e2531c9Paul Duffin * @since 13.0 3737dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 3747dd252788645e940eada959bdde927426e2531c9Paul Duffin public static int fuzzyCompare(double a, double b, double tolerance) { 3757dd252788645e940eada959bdde927426e2531c9Paul Duffin if (fuzzyEquals(a, b, tolerance)) { 3767dd252788645e940eada959bdde927426e2531c9Paul Duffin return 0; 3777dd252788645e940eada959bdde927426e2531c9Paul Duffin } else if (a < b) { 3787dd252788645e940eada959bdde927426e2531c9Paul Duffin return -1; 3797dd252788645e940eada959bdde927426e2531c9Paul Duffin } else if (a > b) { 3807dd252788645e940eada959bdde927426e2531c9Paul Duffin return 1; 3817dd252788645e940eada959bdde927426e2531c9Paul Duffin } else { 3827dd252788645e940eada959bdde927426e2531c9Paul Duffin return Booleans.compare(Double.isNaN(a), Double.isNaN(b)); 3837dd252788645e940eada959bdde927426e2531c9Paul Duffin } 3847dd252788645e940eada959bdde927426e2531c9Paul Duffin } 3857dd252788645e940eada959bdde927426e2531c9Paul Duffin 3860888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("com.google.common.math.DoubleUtils") 3870888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static final class MeanAccumulator { 3880888a09821a98ac0680fad765217302858e70fa4Paul Duffin 3890888a09821a98ac0680fad765217302858e70fa4Paul Duffin private long count = 0; 3900888a09821a98ac0680fad765217302858e70fa4Paul Duffin private double mean = 0.0; 3910888a09821a98ac0680fad765217302858e70fa4Paul Duffin 3920888a09821a98ac0680fad765217302858e70fa4Paul Duffin void add(double value) { 3930888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkArgument(isFinite(value)); 3940888a09821a98ac0680fad765217302858e70fa4Paul Duffin ++count; 3950888a09821a98ac0680fad765217302858e70fa4Paul Duffin // Art of Computer Programming vol. 2, Knuth, 4.2.2, (15) 3960888a09821a98ac0680fad765217302858e70fa4Paul Duffin mean += (value - mean) / count; 3970888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 3980888a09821a98ac0680fad765217302858e70fa4Paul Duffin 3990888a09821a98ac0680fad765217302858e70fa4Paul Duffin double mean() { 4000888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkArgument(count > 0, "Cannot take mean of 0 values"); 4010888a09821a98ac0680fad765217302858e70fa4Paul Duffin return mean; 4020888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4030888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4040888a09821a98ac0680fad765217302858e70fa4Paul Duffin 4050888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 4060888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Returns the arithmetic mean of the values. There must be at least one value, and they must all 4070888a09821a98ac0680fad765217302858e70fa4Paul Duffin * be finite. 4080888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 4090888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("MeanAccumulator") 4100888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static double mean(double... values) { 4110888a09821a98ac0680fad765217302858e70fa4Paul Duffin MeanAccumulator accumulator = new MeanAccumulator(); 4120888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (double value : values) { 4130888a09821a98ac0680fad765217302858e70fa4Paul Duffin accumulator.add(value); 4140888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4150888a09821a98ac0680fad765217302858e70fa4Paul Duffin return accumulator.mean(); 4160888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4170888a09821a98ac0680fad765217302858e70fa4Paul Duffin 4180888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 4190888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Returns the arithmetic mean of the values. There must be at least one value. The values will 4200888a09821a98ac0680fad765217302858e70fa4Paul Duffin * be converted to doubles, which does not cause any loss of precision for ints. 4210888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 4220888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("MeanAccumulator") 4230888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static double mean(int... values) { 4240888a09821a98ac0680fad765217302858e70fa4Paul Duffin MeanAccumulator accumulator = new MeanAccumulator(); 4250888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (int value : values) { 4260888a09821a98ac0680fad765217302858e70fa4Paul Duffin accumulator.add(value); 4270888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4280888a09821a98ac0680fad765217302858e70fa4Paul Duffin return accumulator.mean(); 4290888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4300888a09821a98ac0680fad765217302858e70fa4Paul Duffin 4310888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 4320888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Returns the arithmetic mean of the values. There must be at least one value. The values will 4330888a09821a98ac0680fad765217302858e70fa4Paul Duffin * be converted to doubles, which causes loss of precision for longs of magnitude over 2^53 4340888a09821a98ac0680fad765217302858e70fa4Paul Duffin * (slightly over 9e15). 4350888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 4360888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("MeanAccumulator") 4370888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static double mean(long... values) { 4380888a09821a98ac0680fad765217302858e70fa4Paul Duffin MeanAccumulator accumulator = new MeanAccumulator(); 4390888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (long value : values) { 4400888a09821a98ac0680fad765217302858e70fa4Paul Duffin accumulator.add(value); 4410888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4420888a09821a98ac0680fad765217302858e70fa4Paul Duffin return accumulator.mean(); 4430888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4440888a09821a98ac0680fad765217302858e70fa4Paul Duffin 4450888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 4460888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Returns the arithmetic mean of the values. There must be at least one value, and they must all 4470888a09821a98ac0680fad765217302858e70fa4Paul Duffin * be finite. The values will be converted to doubles, which may cause loss of precision for some 4480888a09821a98ac0680fad765217302858e70fa4Paul Duffin * numeric types. 4490888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 4500888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("MeanAccumulator") 4510888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static double mean(Iterable<? extends Number> values) { 4520888a09821a98ac0680fad765217302858e70fa4Paul Duffin MeanAccumulator accumulator = new MeanAccumulator(); 4530888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (Number value : values) { 4540888a09821a98ac0680fad765217302858e70fa4Paul Duffin accumulator.add(value.doubleValue()); 4550888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4560888a09821a98ac0680fad765217302858e70fa4Paul Duffin return accumulator.mean(); 4570888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4580888a09821a98ac0680fad765217302858e70fa4Paul Duffin 4590888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 4600888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Returns the arithmetic mean of the values. There must be at least one value, and they must all 4610888a09821a98ac0680fad765217302858e70fa4Paul Duffin * be finite. The values will be converted to doubles, which may cause loss of precision for some 4620888a09821a98ac0680fad765217302858e70fa4Paul Duffin * numeric types. 4630888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 4640888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("MeanAccumulator") 4650888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static double mean(Iterator<? extends Number> values) { 4660888a09821a98ac0680fad765217302858e70fa4Paul Duffin MeanAccumulator accumulator = new MeanAccumulator(); 4670888a09821a98ac0680fad765217302858e70fa4Paul Duffin while (values.hasNext()) { 4680888a09821a98ac0680fad765217302858e70fa4Paul Duffin accumulator.add(values.next().doubleValue()); 4690888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4700888a09821a98ac0680fad765217302858e70fa4Paul Duffin return accumulator.mean(); 4710888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4720888a09821a98ac0680fad765217302858e70fa4Paul Duffin 4737dd252788645e940eada959bdde927426e2531c9Paul Duffin private DoubleMath() {} 4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 475