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