SlowCRTest.java revision a8e45a3255089266ccf6500188a2d31af8634e4a
1a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm/* 2a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * Copyright (C) 2015 The Android Open Source Project 3a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * 4a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * Licensed under the Apache License, Version 2.0 (the "License"); 5a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * you may not use this file except in compliance with the License. 6a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * You may obtain a copy of the License at 7a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * 8a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * http://www.apache.org/licenses/LICENSE-2.0 9a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * 10a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * Unless required by applicable law or agreed to in writing, software 11a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * distributed under the License is distributed on an "AS IS" BASIS, 12a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * See the License for the specific language governing permissions and 14a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * limitations under the License. 15a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm */ 16a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 17a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm/* THIS TYPICALLY TAKES > 10 MINUTES TO RUN! It shold generate no output during that time. */ 18a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 19a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehmpackage com.hp.creals; 20a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 21a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehmimport junit.framework.AssertionFailedError; 22a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehmimport junit.framework.TestCase; 23a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 24a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehmimport java.math.BigInteger; 25a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehmimport java.util.Random; 26a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 27a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehmpublic class SlowCRTest extends TestCase { 28a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm private static void check(boolean x, String s) { 29a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (!x) throw new AssertionFailedError(s); 30a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 31a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final static int TEST_PREC = -200; // 200 bits to the right of 32a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // binary point. 33a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final static int NRANDOM = 100; // Number of random values to 34a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // test. Bigger ==> slower 35a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm private static void checkEq(CR x, CR y, String s) { 36a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (x.compareTo(y, TEST_PREC) != 0) throw new AssertionFailedError(s); 37a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 38a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm private static void checkApprEq(CR x, CR y, String s) { 39a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm BigInteger abs_difference = x.subtract(y).get_appr(TEST_PREC).abs(); 40a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (abs_difference.compareTo(BigInteger.ONE) > 0) 41a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm throw new AssertionFailedError(s); 42a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 43a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm private static void checkApprEq(double x, double y, String s) { 44a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (Math.abs(x - y) > 0.000001) throw new AssertionFailedError(s); 45a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 46a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final static BigInteger MASK = 47a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm BigInteger.ONE.shiftLeft(-TEST_PREC).subtract(BigInteger.ONE); 48a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm private static boolean isApprInt(CR x) { 49a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm BigInteger appr = x.get_appr(TEST_PREC); 50a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm return appr.and(MASK).signum() == 0; 51a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 52a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 53a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final static CR ZERO = CR.valueOf(0); 54a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final static CR ONE = CR.valueOf(1); 55a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final static CR TWO = CR.valueOf(2); 56a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final static CR BIG = CR.valueOf(200).exp(); 57a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final static CR SMALL = BIG.inverse(); 58a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 59a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final static UnaryCRFunction ASIN = UnaryCRFunction.asinFunction; 60a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final static UnaryCRFunction ACOS = UnaryCRFunction.acosFunction; 61a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final static UnaryCRFunction ATAN = UnaryCRFunction.atanFunction; 62a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final static UnaryCRFunction TAN = UnaryCRFunction.tanFunction; 63a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final static UnaryCRFunction COSINE = UnaryCRFunction.sinFunction 64a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm .monotoneDerivative(ZERO, CR.PI); 65a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 66a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // Perform some consistency checks on trig functions at x 67a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // We assume that x is within floating point range. 68a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm private static void checkTrig(CR x) { 69a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm double xAsDouble = x.doubleValue(); 70a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (Math.abs(xAsDouble) < 1000000.0) { 71a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(x.sin().doubleValue(), Math.sin(xAsDouble), 72a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "sin float compare:" + xAsDouble); 73a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(x.cos().doubleValue(), Math.cos(xAsDouble), 74a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "cos float compare:" + xAsDouble); 75a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(TAN.execute(x).doubleValue(), Math.tan(xAsDouble), 76a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "tan float compare:" + xAsDouble); 77a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(ATAN.execute(x).doubleValue(), Math.atan(xAsDouble), 78a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "atan float compare:" + xAsDouble); 79a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 80a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (Math.abs(xAsDouble) < 1.0) { 81a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(ASIN.execute(x).doubleValue(), Math.asin(xAsDouble), 82a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "asin float compare:" + xAsDouble); 83a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(ACOS.execute(x).doubleValue(), Math.acos(xAsDouble), 84a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "acos float compare:" + xAsDouble ); 85a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 86a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (xAsDouble < 3.1415926535 && xAsDouble > 0.0) { 87a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(COSINE.execute(x).doubleValue(), Math.cos(xAsDouble), 88a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "deriv(sin) float compare:" + xAsDouble); 89a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(COSINE.execute(x), x.cos(), 90a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "deriv(sin) float compare:" + xAsDouble); 91a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 92a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // Check that sin(x+v) = sin(x)cos(v) + cos(x)sin(v) 93a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // for a couple of different values of v. 94a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm for (int i = 1; i <= 5; ++i) { 95a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm CR v = CR.valueOf(i); 96a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq( 97a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm x.add(v).sin(), 98a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm x.sin().multiply(v.cos()).add(x.cos().multiply(v.sin())), 99a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "Angle sum formula failed for " + xAsDouble + " + " + i); 100a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 101a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(x.cos().multiply(x.cos()).add(x.sin().multiply(x.sin())), 102a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm CR.valueOf(1), 103a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "sin(x)^2 + cos(x)^2 != 1:" + xAsDouble); 104a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // Check that inverses are consistent 105a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(x, TAN.execute(ATAN.execute(x)), 106a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "tan(atan(" + xAsDouble + ")" ); 107a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm CR tmp = ACOS.execute(x.cos()); 108a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // Result or its inverse should differ from x by an 109a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // exact multiple of pi. 110a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm check(isApprInt(tmp.subtract(x).divide(CR.PI)) 111a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm || isApprInt(tmp.add(x).divide(CR.PI)), 112a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "acos(cos):" + xAsDouble); 113a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm tmp = ASIN.execute(x.sin()); 114a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // Result or its inverse should differ from x by an 115a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // exact multiple of pi. 116a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm check(isApprInt(tmp.subtract(x).divide(CR.PI)) 117a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm || isApprInt(tmp.add(x).divide(CR.PI)), 118a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "acos(cos):" + xAsDouble); 119a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 120a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 121a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm private static void checkExpLn(CR x) { 122a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm double xAsDouble = x.doubleValue(); 123a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (Math.abs(xAsDouble) < 10.0) { 124a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(x.exp().doubleValue(), Math.exp(xAsDouble), 125a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "exp float compare:" + xAsDouble); 126a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 127a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (Math.abs(xAsDouble) <= 1000.0) { 128a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(x, x.exp().ln(), "ln(exp) failed:" + xAsDouble); 129a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(x.multiply(CR.valueOf(2)).exp(), 130a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 131a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm x.exp().multiply(x.exp()), 132a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "exp^2 failed:" + xAsDouble); 133a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 134a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (xAsDouble > 0.000000001) { 135a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(x.ln().doubleValue(), Math.log(xAsDouble), 136a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "exp float compare:" + xAsDouble); 137a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(x, x.ln().exp(), "exp(ln) failed:" + xAsDouble); 138a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(x.ln().divide(CR.valueOf(2)), x.sqrt().ln(), 139a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "ln(sqrt) failed:" + xAsDouble); 140a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // Check that ln(xv) = ln(x) + ln(v) for various v 141a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm for (int i = 1; i <= 5; ++i) { 142a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm CR v = CR.valueOf(i); 143a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq( 144a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm x.ln().add(v.ln()), 145a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm x.multiply(v).ln(), 146a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "ln(product) formula failed for:" + xAsDouble + "," + i); 147a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 148a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 149a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 150a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 151a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm private static void checkBasic(CR x) { 152a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(x.abs().sqrt().multiply(x.abs().sqrt()), x.abs(), 153a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "sqrt*sqrt:" + x.doubleValue()); 154a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (!x.get_appr(TEST_PREC).equals(BigInteger.ZERO)) { 155a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(x.inverse().inverse(), x, 156a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm "inverse(inverse):" + x.doubleValue()); 157a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 158a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 159a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 160a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm public void testSlowTrig() { 161a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(ACOS.execute(ZERO), CR.PI.divide(TWO), "acos(0)"); 162a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(ACOS.execute(ONE), ZERO, "acos(1)"); 163a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(ACOS.execute(ONE.negate()), CR.PI, "acos(-1)"); 164a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(ASIN.execute(ZERO), ZERO, "asin(0)"); 165a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(ASIN.execute(ONE), CR.PI.divide(TWO), "asin(1)"); 166a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(ASIN.execute(ONE.negate()), 167a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm CR.PI.divide(TWO).negate(), "asin(-1)"); 168a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkTrig(ZERO); 169a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm CR BIG = CR.valueOf(200).exp(); 170a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkTrig(BIG); 171a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkTrig(BIG.negate()); 172a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkTrig(SMALL); 173a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkTrig(SMALL.negate()); 174a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkTrig(CR.PI); 175a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkTrig(CR.PI.subtract(SMALL)); 176a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkTrig(CR.PI.add(SMALL)); 177a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkTrig(CR.PI.negate()); 178a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkTrig(CR.PI.negate().subtract(SMALL)); 179a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkTrig(CR.PI.negate().add(SMALL)); 180a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm Random r = new Random(); // Random seed! 181a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm for (int i = 0; i < NRANDOM; ++i) { 182a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm double d = Math.exp(2.0 * r.nextDouble() - 1.0); 183a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (r.nextBoolean()) d = -d; 184a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final CR x = CR.valueOf(d); 185a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkTrig(x); 186a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 187a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // And a few big ones 188a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm for (int i = 0; i < 10; ++i) { 189a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm double d = Math.exp(200.0 * r.nextDouble()); 190a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (r.nextBoolean()) d = -d; 191a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final CR x = CR.valueOf(d); 192a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkTrig(x); 193a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 194a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 195a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 196a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm public void testSlowExpLn() { 197a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(CR.valueOf(1).ln(), CR.valueOf(0), "ln(1) != 0"); 198a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkExpLn(CR.valueOf(0)); 199a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm CR BIG = CR.valueOf(200).exp(); 200a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkExpLn(BIG); 201a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkExpLn(BIG.negate()); 202a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkExpLn(SMALL); 203a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkExpLn(SMALL.negate()); 204a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkExpLn(CR.PI); 205a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkExpLn(ONE); 206a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkExpLn(ONE.subtract(SMALL)); 207a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkExpLn(ONE.negate().subtract(SMALL)); 208a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm Random r = new Random(); // Random seed! 209a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm for (int i = 0; i < NRANDOM; ++i) { 210a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm double d = Math.exp(10.0 * r.nextDouble() - 1.0); 211a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (r.nextBoolean()) d = -d; 212a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final CR x = CR.valueOf(d); 213a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkExpLn(x); 214a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 215a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // And a few big ones 216a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm for (int i = 0; i < 10; ++i) { 217a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm double d = Math.exp(200.0 * r.nextDouble()); 218a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (r.nextBoolean()) d = -d; 219a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final CR x = CR.valueOf(d); 220a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkExpLn(x); 221a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 222a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 223a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm 224a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm public void testSlowBasic() { 225a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(ZERO.sqrt(), ZERO, "sqrt(0)"); 226a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkApprEq(ZERO.abs(), ZERO, "abs(0)"); 227a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm Random r = new Random(); // Random seed! 228a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm for (int i = 0; i < NRANDOM; ++i) { 229a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm double d = Math.exp(10.0 * r.nextDouble() - 1.0); 230a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (r.nextBoolean()) d = -d; 231a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final CR x = CR.valueOf(d); 232a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkBasic(x); 233a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 234a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm // And a few very big ones, but within IEEE double range 235a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm for (int i = 0; i < 10; ++i) { 236a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm double d = Math.exp(600.0 * r.nextDouble()); 237a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm if (r.nextBoolean()) d = -d; 238a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm final CR x = CR.valueOf(d); 239a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm checkBasic(x); 240a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 241a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm } 242a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm} 243