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.math.MathTesting.ALL_DOUBLE_CANDIDATES; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.ALL_ROUNDING_MODES; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.ALL_SAFE_ROUNDING_MODES; 227dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.math.MathTesting.DOUBLE_CANDIDATES_EXCEPT_NAN; 237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.math.MathTesting.FINITE_DOUBLE_CANDIDATES; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.FRACTIONAL_DOUBLE_CANDIDATES; 257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.math.MathTesting.INFINITIES; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.INTEGRAL_DOUBLE_CANDIDATES; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.NEGATIVE_INTEGER_CANDIDATES; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.math.MathTesting.POSITIVE_FINITE_DOUBLE_CANDIDATES; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.CEILING; 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.DOWN; 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.FLOOR; 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.UNNECESSARY; 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.math.RoundingMode.UP; 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList; 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 360888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.GwtCompatible; 370888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.GwtIncompatible; 387dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.ImmutableList; 397dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.Iterables; 407dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.primitives.Doubles; 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester; 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase; 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.BigDecimal; 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.BigInteger; 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.RoundingMode; 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays; 497dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.List; 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@code DoubleMath}. 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin@GwtCompatible(emulated = true) 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class DoubleMathTest extends TestCase { 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final BigDecimal MAX_INT_AS_BIG_DECIMAL = BigDecimal.valueOf(Integer.MAX_VALUE); 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final BigDecimal MIN_INT_AS_BIG_DECIMAL = BigDecimal.valueOf(Integer.MIN_VALUE); 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final BigDecimal MAX_LONG_AS_BIG_DECIMAL = BigDecimal.valueOf(Long.MAX_VALUE); 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final BigDecimal MIN_LONG_AS_BIG_DECIMAL = BigDecimal.valueOf(Long.MIN_VALUE); 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 657dd252788645e940eada959bdde927426e2531c9Paul Duffin private static final double MIN_NORMAL = 2.2250738585072014E-308; // Doubles.MIN_NORMAL from 1.6 667dd252788645e940eada959bdde927426e2531c9Paul Duffin 677dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testConstantsMaxFactorial() { 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin BigInteger maxDoubleValue = BigDecimal.valueOf(Double.MAX_VALUE).toBigInteger(); 690888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertTrue(BigIntegerMath.factorial(DoubleMath.MAX_FACTORIAL).compareTo(maxDoubleValue) <= 0); 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue( 710888a09821a98ac0680fad765217302858e70fa4Paul Duffin BigIntegerMath.factorial(DoubleMath.MAX_FACTORIAL + 1).compareTo(maxDoubleValue) > 0); 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testConstantsEverySixteenthFactorial() { 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0, n = 0; n <= DoubleMath.MAX_FACTORIAL; i++, n += 16) { 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals( 777dd252788645e940eada959bdde927426e2531c9Paul Duffin BigIntegerMath.factorial(n).doubleValue(), DoubleMath.everySixteenthFactorial[i]); 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 807dd252788645e940eada959bdde927426e2531c9Paul Duffin 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToInt(double, RoundingMode)") 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundIntegralDoubleToInt() { 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : INTEGRAL_DOUBLE_CANDIDATES) { 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) { 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigDecimal expected = new BigDecimal(d).setScale(0, mode); 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean isInBounds = expected.compareTo(MAX_INT_AS_BIG_DECIMAL) <= 0 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert & expected.compareTo(MIN_INT_AS_BIG_DECIMAL) >= 0; 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected.intValue(), DoubleMath.roundToInt(d, mode)); 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(isInBounds); 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(isInBounds); 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 990888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToInt(double, RoundingMode)") 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundFractionalDoubleToInt() { 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : FRACTIONAL_DOUBLE_CANDIDATES) { 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) { 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigDecimal expected = new BigDecimal(d).setScale(0, mode); 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean isInBounds = expected.compareTo(MAX_INT_AS_BIG_DECIMAL) <= 0 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert & expected.compareTo(MIN_INT_AS_BIG_DECIMAL) >= 0; 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected.intValue(), DoubleMath.roundToInt(d, mode)); 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(isInBounds); 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(isInBounds); 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToInt(double, RoundingMode)") 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundExactIntegralDoubleToInt() { 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : INTEGRAL_DOUBLE_CANDIDATES) { 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigDecimal expected = new BigDecimal(d).setScale(0, UNNECESSARY); 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean isInBounds = expected.compareTo(MAX_INT_AS_BIG_DECIMAL) <= 0 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert & expected.compareTo(MIN_INT_AS_BIG_DECIMAL) >= 0; 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected.intValue(), DoubleMath.roundToInt(d, UNNECESSARY)); 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(isInBounds); 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(isInBounds); 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToInt(double, RoundingMode)") 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundExactFractionalDoubleToIntFails() { 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : FRACTIONAL_DOUBLE_CANDIDATES) { 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.roundToInt(d, UNNECESSARY); 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToInt(double, RoundingMode)") 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundNaNToIntAlwaysFails() { 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.roundToInt(Double.NaN, mode); 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToInt(double, RoundingMode)") 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundInfiniteToIntAlwaysFails() { 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.roundToInt(Double.POSITIVE_INFINITY, mode); 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.roundToInt(Double.NEGATIVE_INFINITY, mode); 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1670888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToLong(double, RoundingMode)") 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundIntegralDoubleToLong() { 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : INTEGRAL_DOUBLE_CANDIDATES) { 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) { 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigDecimal expected = new BigDecimal(d).setScale(0, mode); 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean isInBounds = expected.compareTo(MAX_LONG_AS_BIG_DECIMAL) <= 0 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert & expected.compareTo(MIN_LONG_AS_BIG_DECIMAL) >= 0; 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected.longValue(), DoubleMath.roundToLong(d, mode)); 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(isInBounds); 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(isInBounds); 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1850888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToLong(double, RoundingMode)") 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundFractionalDoubleToLong() { 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : FRACTIONAL_DOUBLE_CANDIDATES) { 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) { 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigDecimal expected = new BigDecimal(d).setScale(0, mode); 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean isInBounds = expected.compareTo(MAX_LONG_AS_BIG_DECIMAL) <= 0 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert & expected.compareTo(MIN_LONG_AS_BIG_DECIMAL) >= 0; 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected.longValue(), DoubleMath.roundToLong(d, mode)); 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(isInBounds); 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(isInBounds); 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToLong(double, RoundingMode)") 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundExactIntegralDoubleToLong() { 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : INTEGRAL_DOUBLE_CANDIDATES) { 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // every mode except UNNECESSARY 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigDecimal expected = new BigDecimal(d).setScale(0, UNNECESSARY); 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean isInBounds = expected.compareTo(MAX_LONG_AS_BIG_DECIMAL) <= 0 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert & expected.compareTo(MIN_LONG_AS_BIG_DECIMAL) >= 0; 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected.longValue(), DoubleMath.roundToLong(d, UNNECESSARY)); 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(isInBounds); 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException e) { 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(isInBounds); 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2200888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToLong(double, RoundingMode)") 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundExactFractionalDoubleToLongFails() { 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : FRACTIONAL_DOUBLE_CANDIDATES) { 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.roundToLong(d, UNNECESSARY); 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2300888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToLong(double, RoundingMode)") 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundNaNToLongAlwaysFails() { 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.roundToLong(Double.NaN, mode); 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2400888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToLong(double, RoundingMode)") 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundInfiniteToLongAlwaysFails() { 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.roundToLong(Double.POSITIVE_INFINITY, mode); 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.roundToLong(Double.NEGATIVE_INFINITY, mode); 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2540888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)") 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundIntegralDoubleToBigInteger() { 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : INTEGRAL_DOUBLE_CANDIDATES) { 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) { 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigDecimal expected = new BigDecimal(d).setScale(0, mode); 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected.toBigInteger(), DoubleMath.roundToBigInteger(d, mode)); 2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2640888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)") 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundFractionalDoubleToBigInteger() { 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : FRACTIONAL_DOUBLE_CANDIDATES) { 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_SAFE_ROUNDING_MODES) { 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigDecimal expected = new BigDecimal(d).setScale(0, mode); 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected.toBigInteger(), DoubleMath.roundToBigInteger(d, mode)); 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2740888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)") 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundExactIntegralDoubleToBigInteger() { 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : INTEGRAL_DOUBLE_CANDIDATES) { 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BigDecimal expected = new BigDecimal(d).setScale(0, UNNECESSARY); 2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected.toBigInteger(), DoubleMath.roundToBigInteger(d, UNNECESSARY)); 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2820888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)") 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundExactFractionalDoubleToBigIntegerFails() { 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : FRACTIONAL_DOUBLE_CANDIDATES) { 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.roundToBigInteger(d, UNNECESSARY); 2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2920888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)") 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundNaNToBigIntegerAlwaysFails() { 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.roundToBigInteger(Double.NaN, mode); 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3020888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)") 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundInfiniteToBigIntegerAlwaysFails() { 3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.roundToBigInteger(Double.POSITIVE_INFINITY, mode); 3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.roundToBigInteger(Double.NEGATIVE_INFINITY, mode); 3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected ArithmeticException"); 3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ArithmeticException expected) {} 3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3160888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.roundToBigInteger(double, RoundingMode)") 3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundLog2Floor() { 3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) { 3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int log2 = DoubleMath.log2(d, FLOOR); 3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(StrictMath.pow(2.0, log2) <= d); 3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(StrictMath.pow(2.0, log2 + 1) > d); 3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3250888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.log2(double, RoundingMode), StrictMath") 3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundLog2Ceiling() { 3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) { 3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int log2 = DoubleMath.log2(d, CEILING); 3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(StrictMath.pow(2.0, log2) >= d); 3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double z = StrictMath.pow(2.0, log2 - 1); 3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(z < d); 3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3350888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.log2(double, RoundingMode), StrictMath") 3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundLog2Down() { 3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) { 3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int log2 = DoubleMath.log2(d, DOWN); 3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (d >= 1.0) { 3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(log2 >= 0); 3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(StrictMath.pow(2.0, log2) <= d); 3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(StrictMath.pow(2.0, log2 + 1) > d); 3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(log2 <= 0); 3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(StrictMath.pow(2.0, log2) >= d); 3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(StrictMath.pow(2.0, log2 - 1) < d); 3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3510888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.log2(double, RoundingMode), StrictMath") 3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundLog2Up() { 3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) { 3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int log2 = DoubleMath.log2(d, UP); 3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (d >= 1.0) { 3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(log2 >= 0); 3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(StrictMath.pow(2.0, log2) >= d); 3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(StrictMath.pow(2.0, log2 - 1) < d); 3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(log2 <= 0); 3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(StrictMath.pow(2.0, log2) <= d); 3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(StrictMath.pow(2.0, log2 + 1) > d); 3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3670888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.log2(double, RoundingMode)") 3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundLog2ThrowsOnZerosInfinitiesAndNaN() { 3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : 3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert asList(0.0, -0.0, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN)) { 3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.log2(d, mode); 3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 3750888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) {} 3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3800888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.log2(double, RoundingMode)") 3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRoundLog2ThrowsOnNegative() { 3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (RoundingMode mode : ALL_ROUNDING_MODES) { 3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) { 3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.log2(-d, mode); 3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 3870888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) {} 3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3920888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.isPowerOfTwo, DoubleMath.log2(double, RoundingMode), StrictMath") 3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIsPowerOfTwoYes() { 3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = -1074; i <= 1023; i++) { 3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(DoubleMath.isPowerOfTwo(StrictMath.pow(2.0, i))); 3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3990888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.isPowerOfTwo, DoubleMath.log2(double, RoundingMode), StrictMath") 4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIsPowerOfTwo() { 4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : ALL_DOUBLE_CANDIDATES) { 4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean expected = x > 0 && !Double.isInfinite(x) && !Double.isNaN(x) 4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert && StrictMath.pow(2.0, DoubleMath.log2(x, FLOOR)) == x; 4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected, DoubleMath.isPowerOfTwo(x)); 4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4087dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testLog2SemiMonotonic() { 4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) { 4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(DoubleMath.log2(d + 0.01) >= DoubleMath.log2(d)); 4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4137dd252788645e940eada959bdde927426e2531c9Paul Duffin 4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testLog2Negative() { 4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : POSITIVE_FINITE_DOUBLE_CANDIDATES) { 4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(Double.isNaN(DoubleMath.log2(-d))); 4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testLog2Zero() { 4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Double.NEGATIVE_INFINITY, DoubleMath.log2(0.0)); 4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Double.NEGATIVE_INFINITY, DoubleMath.log2(-0.0)); 4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testLog2NaNInfinity() { 4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Double.POSITIVE_INFINITY, DoubleMath.log2(Double.POSITIVE_INFINITY)); 4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(Double.isNaN(DoubleMath.log2(Double.NEGATIVE_INFINITY))); 4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(Double.isNaN(DoubleMath.log2(Double.NaN))); 4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4310888a09821a98ac0680fad765217302858e70fa4Paul Duffin 4320888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.isMathematicalInteger") 4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIsMathematicalIntegerIntegral() { 4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : INTEGRAL_DOUBLE_CANDIDATES) { 4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(DoubleMath.isMathematicalInteger(d)); 4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4390888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.isMathematicalInteger") 4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIsMathematicalIntegerFractional() { 4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : FRACTIONAL_DOUBLE_CANDIDATES) { 4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(DoubleMath.isMathematicalInteger(d)); 4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4460888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.isMathematicalInteger") 4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIsMathematicalIntegerNotFinite() { 4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double d : 4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Arrays.asList(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN)) { 4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(DoubleMath.isMathematicalInteger(d)); 4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4540888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("Math.ulp") 4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFactorial() { 4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i <= DoubleMath.MAX_FACTORIAL; i++) { 4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double actual = BigIntegerMath.factorial(i).doubleValue(); 4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double result = DoubleMath.factorial(i); 4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(actual, result, Math.ulp(actual)); 4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFactorialTooHigh() { 4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Double.POSITIVE_INFINITY, DoubleMath.factorial(DoubleMath.MAX_FACTORIAL + 1)); 4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Double.POSITIVE_INFINITY, DoubleMath.factorial(DoubleMath.MAX_FACTORIAL + 20)); 4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFactorialNegative() { 4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int n : NEGATIVE_INTEGER_CANDIDATES) { 4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert DoubleMath.factorial(n); 4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalArgumentException"); 4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4767dd252788645e940eada959bdde927426e2531c9Paul Duffin 4777dd252788645e940eada959bdde927426e2531c9Paul Duffin private static final ImmutableList<Double> FINITE_TOLERANCE_CANDIDATES = 4787dd252788645e940eada959bdde927426e2531c9Paul Duffin ImmutableList.of(-0.0, 0.0, 1.0, 100.0, 10000.0, Double.MAX_VALUE); 4797dd252788645e940eada959bdde927426e2531c9Paul Duffin 4807dd252788645e940eada959bdde927426e2531c9Paul Duffin private static final Iterable<Double> TOLERANCE_CANDIDATES = 4817dd252788645e940eada959bdde927426e2531c9Paul Duffin Iterables.concat(FINITE_TOLERANCE_CANDIDATES, ImmutableList.of(Double.POSITIVE_INFINITY)); 4827dd252788645e940eada959bdde927426e2531c9Paul Duffin 4837dd252788645e940eada959bdde927426e2531c9Paul Duffin private static final List<Double> BAD_TOLERANCE_CANDIDATES = 4847dd252788645e940eada959bdde927426e2531c9Paul Duffin Doubles.asList(-Double.MIN_VALUE, -MIN_NORMAL, -1, -20, Double.NaN, 4857dd252788645e940eada959bdde927426e2531c9Paul Duffin Double.NEGATIVE_INFINITY, -0.001); 4867dd252788645e940eada959bdde927426e2531c9Paul Duffin 4877dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testFuzzyEqualsFinite() { 4887dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double a : FINITE_DOUBLE_CANDIDATES) { 4897dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double b : FINITE_DOUBLE_CANDIDATES) { 4907dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double tolerance : FINITE_TOLERANCE_CANDIDATES) { 4917dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals( 4927dd252788645e940eada959bdde927426e2531c9Paul Duffin Math.abs(a - b) <= tolerance, 4937dd252788645e940eada959bdde927426e2531c9Paul Duffin DoubleMath.fuzzyEquals(a, b, tolerance)); 4947dd252788645e940eada959bdde927426e2531c9Paul Duffin } 4957dd252788645e940eada959bdde927426e2531c9Paul Duffin } 4967dd252788645e940eada959bdde927426e2531c9Paul Duffin } 4977dd252788645e940eada959bdde927426e2531c9Paul Duffin } 4987dd252788645e940eada959bdde927426e2531c9Paul Duffin 4997dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testFuzzyInfiniteVersusFiniteWithFiniteTolerance() { 5007dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double inf : INFINITIES) { 5017dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double a : FINITE_DOUBLE_CANDIDATES) { 5027dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double tolerance : FINITE_TOLERANCE_CANDIDATES) { 5037dd252788645e940eada959bdde927426e2531c9Paul Duffin assertFalse(DoubleMath.fuzzyEquals(a, inf, tolerance)); 5047dd252788645e940eada959bdde927426e2531c9Paul Duffin assertFalse(DoubleMath.fuzzyEquals(inf, a, tolerance)); 5057dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5067dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5077dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5087dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5097dd252788645e940eada959bdde927426e2531c9Paul Duffin 5107dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testFuzzyInfiniteVersusInfiniteWithFiniteTolerance() { 5117dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double inf : INFINITIES) { 5127dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double tolerance : FINITE_TOLERANCE_CANDIDATES) { 5137dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(DoubleMath.fuzzyEquals(inf, inf, tolerance)); 5147dd252788645e940eada959bdde927426e2531c9Paul Duffin assertFalse(DoubleMath.fuzzyEquals(inf, -inf, tolerance)); 5157dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5167dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5177dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5187dd252788645e940eada959bdde927426e2531c9Paul Duffin 5197dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testFuzzyEqualsInfiniteTolerance() { 5207dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double a : DOUBLE_CANDIDATES_EXCEPT_NAN) { 5217dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double b : DOUBLE_CANDIDATES_EXCEPT_NAN) { 5227dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(DoubleMath.fuzzyEquals(a, b, Double.POSITIVE_INFINITY)); 5237dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5247dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5257dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5267dd252788645e940eada959bdde927426e2531c9Paul Duffin 5277dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testFuzzyEqualsOneNaN() { 5287dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double a : DOUBLE_CANDIDATES_EXCEPT_NAN) { 5297dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double tolerance : TOLERANCE_CANDIDATES) { 5307dd252788645e940eada959bdde927426e2531c9Paul Duffin assertFalse(DoubleMath.fuzzyEquals(a, Double.NaN, tolerance)); 5317dd252788645e940eada959bdde927426e2531c9Paul Duffin assertFalse(DoubleMath.fuzzyEquals(Double.NaN, a, tolerance)); 5327dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5337dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5347dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5357dd252788645e940eada959bdde927426e2531c9Paul Duffin 5367dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testFuzzyEqualsTwoNaNs() { 5377dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double tolerance : TOLERANCE_CANDIDATES) { 5387dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(DoubleMath.fuzzyEquals(Double.NaN, Double.NaN, tolerance)); 5397dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5407dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5417dd252788645e940eada959bdde927426e2531c9Paul Duffin 5427dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testFuzzyEqualsZeroTolerance() { 5437dd252788645e940eada959bdde927426e2531c9Paul Duffin // make sure we test -0 tolerance 5447dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double zero : Doubles.asList(0.0, -0.0)) { 5457dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double a : ALL_DOUBLE_CANDIDATES) { 5467dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double b : ALL_DOUBLE_CANDIDATES) { 5477dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals(a == b || (Double.isNaN(a) && Double.isNaN(b)), 5487dd252788645e940eada959bdde927426e2531c9Paul Duffin DoubleMath.fuzzyEquals(a, b, zero)); 5497dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5507dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5517dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5527dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5537dd252788645e940eada959bdde927426e2531c9Paul Duffin 5547dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testFuzzyEqualsBadTolerance() { 5557dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double tolerance : BAD_TOLERANCE_CANDIDATES) { 5567dd252788645e940eada959bdde927426e2531c9Paul Duffin try { 5577dd252788645e940eada959bdde927426e2531c9Paul Duffin DoubleMath.fuzzyEquals(1, 2, tolerance); 5587dd252788645e940eada959bdde927426e2531c9Paul Duffin fail("Expected IllegalArgumentException"); 5597dd252788645e940eada959bdde927426e2531c9Paul Duffin } catch (IllegalArgumentException expected) { 5607dd252788645e940eada959bdde927426e2531c9Paul Duffin // success 5617dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5627dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5637dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5647dd252788645e940eada959bdde927426e2531c9Paul Duffin 5657dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testFuzzyCompare() { 5667dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double a : ALL_DOUBLE_CANDIDATES) { 5677dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double b : ALL_DOUBLE_CANDIDATES) { 5687dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double tolerance : TOLERANCE_CANDIDATES) { 5697dd252788645e940eada959bdde927426e2531c9Paul Duffin int expected = DoubleMath.fuzzyEquals(a, b, tolerance) ? 0 : Double.compare(a, b); 5707dd252788645e940eada959bdde927426e2531c9Paul Duffin int actual = DoubleMath.fuzzyCompare(a, b, tolerance); 5717dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals(Integer.signum(expected), Integer.signum(actual)); 5727dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5737dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5747dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5757dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5767dd252788645e940eada959bdde927426e2531c9Paul Duffin 5777dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testFuzzyCompareBadTolerance() { 5787dd252788645e940eada959bdde927426e2531c9Paul Duffin for (double tolerance : BAD_TOLERANCE_CANDIDATES) { 5797dd252788645e940eada959bdde927426e2531c9Paul Duffin try { 5807dd252788645e940eada959bdde927426e2531c9Paul Duffin DoubleMath.fuzzyCompare(1, 2, tolerance); 5817dd252788645e940eada959bdde927426e2531c9Paul Duffin fail("Expected IllegalArgumentException"); 5827dd252788645e940eada959bdde927426e2531c9Paul Duffin } catch (IllegalArgumentException expected) { 5837dd252788645e940eada959bdde927426e2531c9Paul Duffin // success 5847dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5857dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5867dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5877dd252788645e940eada959bdde927426e2531c9Paul Duffin 5880888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.mean") 5890888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testMean_doubleVarargs() { 5900888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(-1.375, DoubleMath.mean(1.1, -2.2, 4.4, -8.8), 1.0e-10); 5910888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(1.1, DoubleMath.mean(1.1), 1.0e-10); 5920888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 5930888a09821a98ac0680fad765217302858e70fa4Paul Duffin DoubleMath.mean(Double.NaN); 5940888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail("Expected IllegalArgumentException"); 5950888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) { 5960888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 5970888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 5980888a09821a98ac0680fad765217302858e70fa4Paul Duffin DoubleMath.mean(Double.POSITIVE_INFINITY); 5990888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail("Expected IllegalArgumentException"); 6000888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) { 6010888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6020888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6030888a09821a98ac0680fad765217302858e70fa4Paul Duffin 6040888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.mean") 6050888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testMean_intVarargs() { 6060888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(-13.75, DoubleMath.mean(11, -22, 44, -88), 1.0e-10); 6070888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(11.0, DoubleMath.mean(11), 1.0e-10); 6080888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6090888a09821a98ac0680fad765217302858e70fa4Paul Duffin 6100888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.mean") 6110888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testMean_longVarargs() { 6120888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(-13.75, DoubleMath.mean(11L, -22L, 44L, -88L), 1.0e-10); 6130888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(11.0, DoubleMath.mean(11L), 1.0e-10); 6140888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6150888a09821a98ac0680fad765217302858e70fa4Paul Duffin 6160888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.mean") 6170888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testMean_emptyVarargs() { 6180888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 6190888a09821a98ac0680fad765217302858e70fa4Paul Duffin DoubleMath.mean(); 6200888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail("Expected IllegalArgumentException"); 6210888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) { 6220888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6230888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6240888a09821a98ac0680fad765217302858e70fa4Paul Duffin 6250888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.mean") 6260888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testMean_doubleIterable() { 6270888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(-1.375, DoubleMath.mean(ImmutableList.of(1.1, -2.2, 4.4, -8.8)), 1.0e-10); 6280888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(1.1, DoubleMath.mean(ImmutableList.of(1.1)), 1.0e-10); 6290888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 6300888a09821a98ac0680fad765217302858e70fa4Paul Duffin DoubleMath.mean(ImmutableList.<Double>of()); 6310888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail("Expected IllegalArgumentException"); 6320888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) { 6330888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6340888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 6350888a09821a98ac0680fad765217302858e70fa4Paul Duffin DoubleMath.mean(ImmutableList.of(Double.NaN)); 6360888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail("Expected IllegalArgumentException"); 6370888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) { 6380888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6390888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 6400888a09821a98ac0680fad765217302858e70fa4Paul Duffin DoubleMath.mean(ImmutableList.of(Double.POSITIVE_INFINITY)); 6410888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail("Expected IllegalArgumentException"); 6420888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) { 6430888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6440888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6450888a09821a98ac0680fad765217302858e70fa4Paul Duffin 6460888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.mean") 6470888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testMean_intIterable() { 6480888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(-13.75, DoubleMath.mean(ImmutableList.of(11, -22, 44, -88)), 1.0e-10); 6490888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(11, DoubleMath.mean(ImmutableList.of(11)), 1.0e-10); 6500888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 6510888a09821a98ac0680fad765217302858e70fa4Paul Duffin DoubleMath.mean(ImmutableList.<Integer>of()); 6520888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail("Expected IllegalArgumentException"); 6530888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) { 6540888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6550888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6560888a09821a98ac0680fad765217302858e70fa4Paul Duffin 6570888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.mean") 6580888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testMean_longIterable() { 6590888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(-13.75, DoubleMath.mean(ImmutableList.of(11L, -22L, 44L, -88L)), 1.0e-10); 6600888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(11, DoubleMath.mean(ImmutableList.of(11L)), 1.0e-10); 6610888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 6620888a09821a98ac0680fad765217302858e70fa4Paul Duffin DoubleMath.mean(ImmutableList.<Long>of()); 6630888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail("Expected IllegalArgumentException"); 6640888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) { 6650888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6660888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6670888a09821a98ac0680fad765217302858e70fa4Paul Duffin 6680888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.mean") 6690888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testMean_intIterator() { 6700888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(-13.75, DoubleMath.mean(ImmutableList.of(11, -22, 44, -88).iterator()), 1.0e-10); 6710888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(11, DoubleMath.mean(ImmutableList.of(11).iterator()), 1.0e-10); 6720888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 6730888a09821a98ac0680fad765217302858e70fa4Paul Duffin DoubleMath.mean(ImmutableList.<Integer>of().iterator()); 6740888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail("Expected IllegalArgumentException"); 6750888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) { 6760888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6770888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6780888a09821a98ac0680fad765217302858e70fa4Paul Duffin 6790888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("DoubleMath.mean") 6800888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testMean_longIterator() { 6810888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(-13.75, DoubleMath.mean(ImmutableList.of(11L, -22L, 44L, -88L).iterator()), 6820888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1.0e-10); 6830888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(11, DoubleMath.mean(ImmutableList.of(11L).iterator()), 1.0e-10); 6840888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 6850888a09821a98ac0680fad765217302858e70fa4Paul Duffin DoubleMath.mean(ImmutableList.<Long>of().iterator()); 6860888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail("Expected IllegalArgumentException"); 6870888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) { 6880888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6890888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 6900888a09821a98ac0680fad765217302858e70fa4Paul Duffin 6910888a09821a98ac0680fad765217302858e70fa4Paul Duffin @GwtIncompatible("NullPointerTester") 6927dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testNullPointers() { 6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert NullPointerTester tester = new NullPointerTester(); 6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.setDefault(double.class, 3.0); 6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.testAllPublicStaticMethods(DoubleMath.class); 6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 698