package jscl.math; import au.com.bytecode.opencsv.CSVReader; import jscl.AngleUnit; import jscl.JsclMathEngine; import jscl.MathEngine; import junit.framework.Assert; import org.junit.Test; import java.io.InputStreamReader; /** * User: serso * Date: 11/22/11 * Time: 12:49 PM */ public class TrigonometricTest { // todo serso: due to conversion errors values on the borders are calculated not precisely /* 0;0;1;0;Infinity 90;1;0;1.633123935319537E16;0 180;0;-1;0;-8.165619676597685E15 270;-1;0;5.443746451065123E15;0 360;0;1;0;-4.0828098382988425E15 */ @Test public void testValues() throws Exception { CSVReader reader = null; try { final MathEngine me = JsclMathEngine.getInstance(); reader = new CSVReader(new InputStreamReader(TrigonometricTest.class.getResourceAsStream("./trig_table.csv")), '\t'); // skip first line reader.readNext(); String[] line = reader.readNext(); for (; line != null; line = reader.readNext()) { final Integer degrees = Integer.valueOf(line[0]); final Double sinValue = Double.valueOf(line[1]); final Double cosValue = Double.valueOf(line[2]); final Double tgValue = Double.valueOf(line[3]); final Double ctgValue = Double.valueOf(line[4]); final Double radians = Double.valueOf(line[5]); final Double sinhValue = Double.valueOf(line[6]); final Double coshValue = Double.valueOf(line[7]); final Double tghValue = Double.valueOf(line[8]); final Double cthgValue = Double.valueOf(line[9]); final Double asinValue = Double.valueOf(line[10]); final Double acosValue = Double.valueOf(line[11]); final Double atanValue = Double.valueOf(line[12]); testValue(sinValue, Double.valueOf(me.evaluate("sin(" + degrees + "°)")), degrees); testValue(cosValue, Double.valueOf(me.evaluate("cos(" + degrees + "°)")), degrees); testValue(tgValue, Double.valueOf(me.evaluate("tan(" + degrees + "°)")), degrees); testValue(ctgValue, Double.valueOf(me.evaluate("cot(" + degrees + "°)")), degrees); testValue(sinhValue, Double.valueOf(me.evaluate("sinh(" + degrees + "°)")), degrees); testValue(coshValue, Double.valueOf(me.evaluate("cosh(" + degrees + "°)")), degrees); testValue(tghValue, Double.valueOf(me.evaluate("tanh(" + degrees + "°)")), degrees); testValue(cthgValue, Double.valueOf(me.evaluate("coth(" + degrees + "°)")), degrees); final AngleUnit angleUnits = me.getAngleUnits(); try { me.setAngleUnits(AngleUnit.rad); testValue(sinValue, Double.valueOf(me.evaluate("sin(" + radians + ")")), degrees); testValue(cosValue, Double.valueOf(me.evaluate("cos(" + radians + ")")), degrees); testValue(tgValue, Double.valueOf(me.evaluate("tan(" + radians + ")")), degrees); testValue(ctgValue, Double.valueOf(me.evaluate("cot(" + radians + ")")), degrees); testValue(sinhValue, Double.valueOf(me.evaluate("sinh(" + radians + ")")), degrees); testValue(coshValue, Double.valueOf(me.evaluate("cosh(" + radians + ")")), degrees); testValue(tghValue, Double.valueOf(me.evaluate("tanh(" + radians + ")")), degrees); testValue(cthgValue, Double.valueOf(me.evaluate("coth(" + radians + ")")), degrees); } finally { me.setAngleUnits(angleUnits); } testValue(asinValue, Double.valueOf(me.evaluate("rad(asin(" + sinValue + "))")), degrees); testValue(acosValue, Double.valueOf(me.evaluate("rad(acos(" + cosValue + "))")), degrees); testValue(atanValue, Double.valueOf(me.evaluate("rad(atan(" + tgValue + "))")), degrees); // todo serso: check this //testValue((double)degrees, Double.valueOf(me.evaluate("asin(sin(" + degrees + "°))")), degrees); //testValue((double)degrees, Double.valueOf(me.evaluate("acos(cos(" + degrees + "°))")), degrees); //testValue((double)degrees, Double.valueOf(me.evaluate("atan(tan(" + degrees + "°))")), degrees); //testValue((double)degrees, Double.valueOf(me.evaluate("acot(cot(" + degrees + "°))")), degrees); testValue(sinValue, Double.valueOf(me.evaluate("sin(asin(sin(" + degrees + "°)))")), degrees); testValue(cosValue, Double.valueOf(me.evaluate("cos(acos(cos(" + degrees + "°)))")), degrees); testValue(tgValue, Double.valueOf(me.evaluate("tan(atan(tan(" + degrees + "°)))")), degrees); testValue(ctgValue, Double.valueOf(me.evaluate("cot(acot(cot(" + degrees + "°)))")), degrees); } } finally { if (reader != null) { reader.close(); } } } private void testValue(Double expected, Double actual, Integer degrees) { if (expected.isInfinite() && actual.isInfinite()) { // ok } else if (expected.isNaN() && actual.isNaN()) { // ok } else { Assert.assertTrue("Actual: " + actual + ", expected: " + expected + " for " + degrees + "°", Math.abs(expected - actual) < Math.pow(10, -10)); } } }