True engineering number formatting

This commit is contained in:
serso
2016-04-03 00:46:58 +02:00
parent f5a9f30e04
commit d9e9380a6d
4 changed files with 299 additions and 114 deletions

View File

@@ -1,8 +1,9 @@
package jscl;
import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* User: serso
* Date: 12/15/11
@@ -15,70 +16,177 @@ public class JsclMathEngineTest {
try {
me.setUseGroupingSeparator(true);
Assert.assertEquals("1", me.format(1d, NumeralBase.bin));
Assert.assertEquals("10", me.format(2d, NumeralBase.bin));
Assert.assertEquals("11", me.format(3d, NumeralBase.bin));
Assert.assertEquals("100", me.format(4d, NumeralBase.bin));
Assert.assertEquals("101", me.format(5d, NumeralBase.bin));
Assert.assertEquals("110", me.format(6d, NumeralBase.bin));
Assert.assertEquals("111", me.format(7d, NumeralBase.bin));
Assert.assertEquals("1000", me.format(8d, NumeralBase.bin));
Assert.assertEquals("1001", me.format(9d, NumeralBase.bin));
Assert.assertEquals("1 0001", me.format(17d, NumeralBase.bin));
Assert.assertEquals("1 0100", me.format(20d, NumeralBase.bin));
Assert.assertEquals("1 0100", me.format(20d, NumeralBase.bin));
Assert.assertEquals("1 1111", me.format(31d, NumeralBase.bin));
assertEquals("1", me.format(1d, NumeralBase.bin));
assertEquals("10", me.format(2d, NumeralBase.bin));
assertEquals("11", me.format(3d, NumeralBase.bin));
assertEquals("100", me.format(4d, NumeralBase.bin));
assertEquals("101", me.format(5d, NumeralBase.bin));
assertEquals("110", me.format(6d, NumeralBase.bin));
assertEquals("111", me.format(7d, NumeralBase.bin));
assertEquals("1000", me.format(8d, NumeralBase.bin));
assertEquals("1001", me.format(9d, NumeralBase.bin));
assertEquals("1 0001", me.format(17d, NumeralBase.bin));
assertEquals("1 0100", me.format(20d, NumeralBase.bin));
assertEquals("1 0100", me.format(20d, NumeralBase.bin));
assertEquals("1 1111", me.format(31d, NumeralBase.bin));
me.setRoundResult(true);
me.setPrecision(10);
Assert.assertEquals("111 1111 0011 0110", me.format(32566d, NumeralBase.bin));
Assert.assertEquals("100.0100 1100 11", me.format(4.3d, NumeralBase.bin));
Assert.assertEquals("1 0001 0101 0011.0101 0101 10", me.format(4435.33423d, NumeralBase.bin));
Assert.assertEquals("1100.0101 0101 01", me.format(12.3333d, NumeralBase.bin));
Assert.assertEquals("1 0011 1101 1110 0100 0011 0101 0101.0001 1111 00", me.format(333333333.1212213321d, NumeralBase.bin));
assertEquals("111 1111 0011 0110", me.format(32566d, NumeralBase.bin));
assertEquals("100.0100 1100 11", me.format(4.3d, NumeralBase.bin));
assertEquals("1 0001 0101 0011.0101 0101 10", me.format(4435.33423d, NumeralBase.bin));
assertEquals("1100.0101 0101 01", me.format(12.3333d, NumeralBase.bin));
assertEquals("1 0011 1101 1110 0100 0011 0101 0101.0001 1111 00", me.format(333333333.1212213321d, NumeralBase.bin));
Assert.assertEquals("0.EE EE EE EE EE", me.format(14d / 15d, NumeralBase.hex));
Assert.assertEquals("7F 36", me.format(32566d, NumeralBase.hex));
Assert.assertEquals("24", me.format(36d, NumeralBase.hex));
Assert.assertEquals("8", me.format(8d, NumeralBase.hex));
Assert.assertEquals("1 3D", me.format(317d, NumeralBase.hex));
Assert.assertEquals("13 DE 43 55.1F 08 5B EF 14", me.format(333333333.1212213321d, NumeralBase.hex));
Assert.assertEquals("D 25 0F 77 0A.6F 73 18 FC 50", me.format(56456345354.43534534523459999d, NumeralBase.hex));
Assert.assertEquals("3 E7.4C CC CC CC CC", me.format(999.3d, NumeralBase.hex));
assertEquals("0.EE EE EE EE EE", me.format(14d / 15d, NumeralBase.hex));
assertEquals("7F 36", me.format(32566d, NumeralBase.hex));
assertEquals("24", me.format(36d, NumeralBase.hex));
assertEquals("8", me.format(8d, NumeralBase.hex));
assertEquals("1 3D", me.format(317d, NumeralBase.hex));
assertEquals("13 DE 43 55.1F 08 5B EF 14", me.format(333333333.1212213321d, NumeralBase.hex));
assertEquals("D 25 0F 77 0A.6F 73 18 FC 50", me.format(56456345354.43534534523459999d, NumeralBase.hex));
assertEquals("3 E7.4C CC CC CC CC", me.format(999.3d, NumeralBase.hex));
me.setRoundResult(false);
Assert.assertEquals("0.00 00 00 00 00 00 00 00 00 6C", me.format(0.00000000000000000000009d, NumeralBase.hex));
Assert.assertEquals("0.00 00 00 00 00 00 00 00 00 0A", me.format(0.000000000000000000000009d, NumeralBase.hex));
assertEquals("0.00 00 00 00 00 00 00 00 00 6C", me.format(0.00000000000000000000009d, NumeralBase.hex));
assertEquals("0.00 00 00 00 00 00 00 00 00 0A", me.format(0.000000000000000000000009d, NumeralBase.hex));
} finally {
me.setUseGroupingSeparator(false);
}
Assert.assertEquals("1", me.format(1d, NumeralBase.bin));
Assert.assertEquals("10", me.format(2d, NumeralBase.bin));
Assert.assertEquals("11", me.format(3d, NumeralBase.bin));
Assert.assertEquals("100", me.format(4d, NumeralBase.bin));
Assert.assertEquals("101", me.format(5d, NumeralBase.bin));
Assert.assertEquals("110", me.format(6d, NumeralBase.bin));
Assert.assertEquals("111", me.format(7d, NumeralBase.bin));
Assert.assertEquals("1000", me.format(8d, NumeralBase.bin));
Assert.assertEquals("1001", me.format(9d, NumeralBase.bin));
Assert.assertEquals("10001", me.format(17d, NumeralBase.bin));
Assert.assertEquals("10100", me.format(20d, NumeralBase.bin));
Assert.assertEquals("10100", me.format(20d, NumeralBase.bin));
Assert.assertEquals("11111", me.format(31d, NumeralBase.bin));
Assert.assertEquals("111111100110110", me.format(32566d, NumeralBase.bin));
assertEquals("1", me.format(1d, NumeralBase.bin));
assertEquals("10", me.format(2d, NumeralBase.bin));
assertEquals("11", me.format(3d, NumeralBase.bin));
assertEquals("100", me.format(4d, NumeralBase.bin));
assertEquals("101", me.format(5d, NumeralBase.bin));
assertEquals("110", me.format(6d, NumeralBase.bin));
assertEquals("111", me.format(7d, NumeralBase.bin));
assertEquals("1000", me.format(8d, NumeralBase.bin));
assertEquals("1001", me.format(9d, NumeralBase.bin));
assertEquals("10001", me.format(17d, NumeralBase.bin));
assertEquals("10100", me.format(20d, NumeralBase.bin));
assertEquals("10100", me.format(20d, NumeralBase.bin));
assertEquals("11111", me.format(31d, NumeralBase.bin));
assertEquals("111111100110110", me.format(32566d, NumeralBase.bin));
Assert.assertEquals("7F36", me.format(32566d, NumeralBase.hex));
Assert.assertEquals("24", me.format(36d, NumeralBase.hex));
Assert.assertEquals("8", me.format(8d, NumeralBase.hex));
Assert.assertEquals("13D", me.format(317d, NumeralBase.hex));
assertEquals("7F36", me.format(32566d, NumeralBase.hex));
assertEquals("24", me.format(36d, NumeralBase.hex));
assertEquals("8", me.format(8d, NumeralBase.hex));
assertEquals("13D", me.format(317d, NumeralBase.hex));
}
@Test
public void testPiComputation() throws Exception {
final JsclMathEngine me = JsclMathEngine.getInstance();
Assert.assertEquals("-1+122.46467991473532E-18*i", me.evaluate("exp(√(-1)*Π)"));
assertEquals("-1+122.46467991473532E-18*i", me.evaluate("exp(√(-1)*Π)"));
}
@Test
public void testEngineeringNotationWithRounding() throws Exception {
final JsclMathEngine me = JsclMathEngine.getInstance();
me.setScienceNotation(true);
me.setRoundResult(true);
me.setPrecision(5);
assertEquals("10E6", me.format(10000000d));
assertEquals("99E6", me.format(99000000d));
assertEquals("999E6", me.format(999000000d));
assertEquals("999E6", me.format(999000001d));
assertEquals("999.00001E6", me.format(999000011d));
assertEquals("1E6", me.format(1000000d));
assertEquals("111.11E3", me.format(111110d));
assertEquals("111.1E3", me.format(111100d));
assertEquals("111E3", me.format(111000d));
assertEquals("110E3", me.format(110000d));
assertEquals("100E3", me.format(100000d));
assertEquals("10E3", me.format(10000d));
assertEquals("1E3", me.format(1000d));
assertEquals("100", me.format(100d));
assertEquals("100.1", me.format(100.1d));
assertEquals("100.12", me.format(100.12d));
assertEquals("100.12345", me.format(100.123454d));
assertEquals("100.12346", me.format(100.123455d));
assertEquals("100.12346", me.format(100.123456d));
assertEquals("1", me.format(1d));
assertEquals("-42", me.format(-42d));
assertEquals("-999", me.format(-999d));
assertEquals("-999.99", me.format(-999.99d));
assertEquals("-0.1", me.format(-0.1d));
assertEquals("-0.12", me.format(-0.12d));
assertEquals("-0.123", me.format(-0.123d));
assertEquals("-0.1234", me.format(-0.1234d));
assertEquals("0.1", me.format(0.1));
assertEquals("0.01", me.format(0.01));
assertEquals("0.001", me.format(0.001));
assertEquals("0.001", me.format(0.00100000001));
assertEquals("0.0011", me.format(0.0011));
assertEquals("999.999E-6", me.format(0.000999999));
assertEquals("100E-6", me.format(0.0001));
assertEquals("1E-6", me.format(0.000001));
assertEquals("10E-9", me.format(0.00000001));
assertEquals("-100.001E3", me.format(-100001d));
assertEquals("100.001E3", me.format(100001d));
assertEquals("111.111E3", me.format(111111d));
assertEquals("111.11123E3", me.format(111111.234567d));
assertEquals("111.11123E3", me.format(111111.23456d));
assertEquals("111.11123E3", me.format(111111.2345d));
assertEquals("111.11123E3", me.format(111111.2345d));
assertEquals("111.11123E3", me.format(111111.234d));
assertEquals("111.11123E3", me.format(111111.23d));
assertEquals("111.1112E3", me.format(111111.2d));
}
@Test
public void testEngineeringNotationWithoutRounding() throws Exception {
final JsclMathEngine me = JsclMathEngine.getInstance();
me.setScienceNotation(true);
me.setRoundResult(false);
assertEquals("10E6", me.format(10000000d));
assertEquals("99E6", me.format(99000000d));
assertEquals("999E6", me.format(999000000d));
assertEquals("999.000001E6", me.format(999000001d));
assertEquals("999.000011E6", me.format(999000011d));
assertEquals("1E6", me.format(1000000d));
assertEquals("111.11E3", me.format(111110d));
assertEquals("111.1E3", me.format(111100d));
assertEquals("111E3", me.format(111000d));
assertEquals("110E3", me.format(110000d));
assertEquals("100E3", me.format(100000d));
assertEquals("10E3", me.format(10000d));
assertEquals("1E3", me.format(1000d));
assertEquals("100", me.format(100d));
assertEquals("100.1", me.format(100.1d));
assertEquals("100.12", me.format(100.12d));
assertEquals("100.123454", me.format(100.123454d));
assertEquals("100.123455", me.format(100.123455d));
assertEquals("100.123456", me.format(100.123456d));
assertEquals("1", me.format(1d));
assertEquals("-42", me.format(-42d));
assertEquals("-999", me.format(-999d));
assertEquals("-999.99", me.format(-999.99d));
assertEquals("-0.1", me.format(-0.1d));
assertEquals("-0.12", me.format(-0.12d));
assertEquals("-0.123", me.format(-0.123d));
assertEquals("-0.1234", me.format(-0.1234d));
assertEquals("0.1", me.format(0.1));
assertEquals("0.01", me.format(0.01));
assertEquals("0.001", me.format(0.001));
assertEquals("0.0011", me.format(0.0011));
assertEquals("999.999E-6", me.format(0.000999999));
assertEquals("100E-6", me.format(0.0001));
assertEquals("100.001E3", me.format(100001d));
assertEquals("111.111E3", me.format(111111d));
assertEquals("111.111234567E3", me.format(111111.234567d));
assertEquals("111.11123456E3", me.format(111111.23456d));
assertEquals("111.1112345E3", me.format(111111.2345d));
assertEquals("111.1112345E3", me.format(111111.2345d));
assertEquals("111.111234E3", me.format(111111.234d));
assertEquals("111.11123E3", me.format(111111.23d));
assertEquals("111.1112E3", me.format(111111.2d));
}
}

View File

@@ -798,13 +798,19 @@ public class ExpressionTest {
me.setScienceNotation(true);
Assert.assertEquals("0", Expression.valueOf("0.0").simplify().toString());
Assert.assertEquals("1E0", Expression.valueOf("1.0").simplify().toString());
Assert.assertEquals("100E0", Expression.valueOf("100.0").simplify().toString());
Assert.assertEquals("1", Expression.valueOf("1.0").simplify().toString());
Assert.assertEquals("100", Expression.valueOf("100.0").simplify().toString());
me.setScienceNotation(false);
me.setRoundResult(true);
me.setPrecision(5);
Assert.assertEquals("0", Expression.valueOf("1222/(10^9)").numeric().toString());
me.setScienceNotation(true);
me.setRoundResult(true);
me.setPrecision(5);
Assert.assertEquals("1.222E-6", Expression.valueOf("1222/(10^9)").numeric().toString());
me.setRoundResult(true);
me.setPrecision(10);
Assert.assertEquals("1.222E-6", Expression.valueOf("1222/(10^9)").numeric().toString());
@@ -816,11 +822,11 @@ public class ExpressionTest {
Assert.assertEquals("0.3333333333333333", Expression.valueOf("1/3").numeric().toString());
me.setScienceNotation(true);
Assert.assertEquals("333.33333E-3", Expression.valueOf("1/3").numeric().toString());
Assert.assertEquals("0.3333333333333333", Expression.valueOf("1/3").numeric().toString());
me.setRoundResult(true);
me.setPrecision(10);
Assert.assertEquals("333.33333E-3", Expression.valueOf("1/3").numeric().toString());
Assert.assertEquals("0.3333333333", Expression.valueOf("1/3").numeric().toString());
me.setScienceNotation(false);
me.setRoundResult(true);