package edu.stanford.nlp.math;
import edu.stanford.nlp.util.Triple;
import junit.framework.TestCase;
public class SloppyMathTest extends TestCase {
@Override
public void setUp() {
}
public void testRound1() {
assertEquals(0.0, SloppyMath.round(0.499));
assertEquals(0.0, SloppyMath.round(-0.5));
assertEquals(10.0, SloppyMath.round(10));
assertEquals(10.0, SloppyMath.round(10.32));
}
public void testRound2() {
assertEquals(3.14, SloppyMath.round(Math.PI, 2));
assertEquals(400.0, SloppyMath.round(431.5, -2));
assertEquals(432.0, SloppyMath.round(431.5, 0));
assertEquals(0.0, SloppyMath.round(-0.05, 1));
assertEquals(-0.05, SloppyMath.round(-0.05, 2));
}
public void testMax() {
assertEquals(3,SloppyMath.max(1,2,3));
}
public void testMin() {
assertEquals(1,SloppyMath.min(1,2,3));
}
public void testIsDangerous() {
assertTrue(SloppyMath.isDangerous(Double.POSITIVE_INFINITY) &&
SloppyMath.isDangerous(Double.NaN) &&
SloppyMath.isDangerous(0));
}
public void testIsVeryDangerous() {
assertTrue(SloppyMath.isDangerous(Double.POSITIVE_INFINITY) &&
SloppyMath.isDangerous(Double.NaN));
}
public void testLogAdd() {
double d1 = 0.1;
double d2 = 0.2;
double lsum = SloppyMath.logAdd(d1,d2);
double myLsum = 0;
myLsum += Math.exp(d1);
myLsum += Math.exp(d2);
myLsum = Math.log(myLsum);
assertTrue(myLsum == lsum);
}
public void testIntPow() {
assertTrue(SloppyMath.intPow(3,5)==Math.pow(3,5));
assertTrue(SloppyMath.intPow(3.3,5)-Math.pow(3.3,5) < 1e-4);
assertEquals(1, SloppyMath.intPow(5,0));
assertEquals(3125, SloppyMath.intPow(5,5));
assertEquals(32, SloppyMath.intPow(2,5));
assertEquals(3, SloppyMath.intPow(3,1));
assertEquals(1158.56201, SloppyMath.intPow(4.1, 5), 1e-4);
assertEquals(1158.56201f, SloppyMath.intPow(4.1f, 5), 1e-2);
}
public void testArccos() {
assertEquals(Math.PI, SloppyMath.acos(-1.0), 0.001);
assertEquals(0, SloppyMath.acos(1.0), 0.001);
assertEquals(Math.PI / 2, SloppyMath.acos(0.0), 0.001);
for (double x = -1.0; x < 1.0; x += 0.001) {
assertEquals(Math.acos(x), SloppyMath.acos(x), 0.001);
}
try {
SloppyMath.acos(-1.0000001);
assertFalse(true);
} catch (IllegalArgumentException e) { }
try {
SloppyMath.acos(1.0000001);
assertFalse(true);
} catch (IllegalArgumentException e) { }
}
public void testPythonMod() {
assertEquals(0, SloppyMath.pythonMod(9, 3));
assertEquals(0, SloppyMath.pythonMod(-9, 3));
assertEquals(0, SloppyMath.pythonMod(9, -3));
assertEquals(0, SloppyMath.pythonMod(-9, -3));
assertEquals(2, SloppyMath.pythonMod(8, 3));
assertEquals(1, SloppyMath.pythonMod(-8, 3));
assertEquals(-1, SloppyMath.pythonMod(8, -3));
assertEquals(-2, SloppyMath.pythonMod(-8, -3));
}
public void testParseDouble() {
for (int base = -10; base < 10; ++base) {
if (base == 0) { continue; }
for (int exponent = -100; exponent < 100; ++exponent) {
double number = Math.pow(Math.PI * base, exponent);
Triple<Boolean, Long, Integer> parts = SloppyMath.segmentDouble(number);
double parsed = SloppyMath.parseDouble(parts.first, parts.second, parts.third);
assertEquals(number, parsed, Math.abs(parsed) / 1.0e5);
}
}
}
public void testParseInt() {
assertEquals(42, SloppyMath.parseInt("42"));
assertEquals(-42, SloppyMath.parseInt("-42"));
assertEquals(42000000000000l, SloppyMath.parseInt("42000000000000"));
}
}