public BigDecimal ToBigDecimal(BigDecimal.Context c) { BigDecimal numerator = BigDecimal.Create(this.numerator); BigDecimal denominator = BigDecimal.Create(this.denominator); return(numerator.Divide(denominator, c)); }
public void ToBigDecimalWithContextWorks() { BigInteger n1 = BigInteger.Create(1); BigInteger d1 = BigInteger.Create(3); Ratio r1 = new Ratio(n1, d1); BigDecimal.Context c = new BigDecimal.Context(6, BigDecimal.RoundingMode.HalfUp); BigDecimal bd = r1.ToBigDecimal(c); Expect(bd, EqualTo(BigDecimal.Parse("0.333333"))); }
public void ToDoubleWorks() { BigInteger n1 = BigInteger.Create(1); BigInteger d1 = BigInteger.Create(3); Ratio r1 = new Ratio(n1, d1); BigDecimal.Context c = new BigDecimal.Context(6, BigDecimal.RoundingMode.HalfUp); double d = r1.ToDouble(null); Expect(d, EqualTo(0.3333333333333333)); // precision = 16 }
public void CanCreateFromDecimal() { BigDecimal.Context c9hu = new BigDecimal.Context(9, BigDecimal.RoundingMode.HalfUp); TestDecimal(0M, "0", c9hu); TestDecimal(1M, "1", c9hu); TestDecimal(2M, "2", c9hu); TestDecimal(3M, "3", c9hu); TestDecimal(4M, "4", c9hu); TestDecimal(5M, "5", c9hu); TestDecimal(6M, "6", c9hu); TestDecimal(7M, "7", c9hu); TestDecimal(8M, "8", c9hu); TestDecimal(9M, "9", c9hu); TestDecimal(10M, "10", c9hu); TestDecimal(11M, "11", c9hu); TestDecimal(12M, "12", c9hu); TestDecimal(1M, "1", c9hu); TestDecimal(10M, "10", c9hu); TestDecimal(100M, "100", c9hu); TestDecimal(1000M, "1000", c9hu); TestDecimal(10000M, "10000", c9hu); TestDecimal(100000M, "100000", c9hu); TestDecimal(1000000M, "1000000", c9hu); TestDecimal(10000000M, "10000000", c9hu); TestDecimal(100000000M, "100000000", c9hu); TestDecimal(1000000000M, "1.00000000E+9", c9hu); TestDecimal(10000000000M, "1.00000000E+10", c9hu); TestDecimal(100000000000M, "1.00000000E+11", c9hu); TestDecimal(1000000000000M, "1.00000000E+12", c9hu); TestDecimal(10000000000000M, "1.00000000E+13", c9hu); TestDecimal(100000000000000M, "1.00000000E+14", c9hu); TestDecimal(1000000000000000M, "1.00000000E+15", c9hu); TestDecimal(0.1M, "0.1", c9hu); TestDecimal(0.01M, "0.01", c9hu); TestDecimal(0.001M, "0.001", c9hu); TestDecimal(0.0001M, "0.0001", c9hu); TestDecimal(0.00001M, "0.00001", c9hu); TestDecimal(0.000001M, "0.000001", c9hu); TestDecimal(0.0000001M, "1E-7", c9hu); TestDecimal(0.00000001M, "1E-8", c9hu); TestDecimal(0.000000001M, "1E-9", c9hu); TestDecimal(0.0000000001M, "1E-10", c9hu); TestDecimal(0.00000000001M, "1E-11", c9hu); TestDecimal(0.000000000001M, "1E-12", c9hu); TestDecimal(0.0000000000001M, "1E-13", c9hu); TestDecimal(0.00000000000001M, "1E-14", c9hu); TestDecimal(1.234567891M, "1.23456789", c9hu); TestDecimal(12.34567891M, "12.3456789", c9hu); TestDecimal(123.4567891M, "123.456789", c9hu); TestDecimal(1234.567891M, "1234.56789", c9hu); TestDecimal(12345.67891M, "12345.6789", c9hu); TestDecimal(123456.7891M, "123456.789", c9hu); TestDecimal(1234567.891M, "1234567.89", c9hu); TestDecimal(12345678.91M, "12345678.9", c9hu); TestDecimal(123456789.1M, "123456789", c9hu); TestDecimal(1234567891M, "1.23456789E+9", c9hu); TestDecimal(12345678910M, "1.23456789E+10", c9hu); TestDecimal(123456789100M, "1.23456789E+11", c9hu); TestDecimal(1234567891000M, "1.23456789E+12", c9hu); TestDecimal(1.234567896M, "1.23456790", c9hu); TestDecimal(12.34567896M, "12.3456790", c9hu); TestDecimal(123.4567896M, "123.456790", c9hu); TestDecimal(1234.567896M, "1234.56790", c9hu); TestDecimal(12345.67896M, "12345.6790", c9hu); TestDecimal(123456.7896M, "123456.790", c9hu); TestDecimal(1234567.896M, "1234567.90", c9hu); TestDecimal(12345678.96M, "12345679.0", c9hu); TestDecimal(123456789.6M, "123456790", c9hu); TestDecimal(1234567896M, "1.23456790E+9", c9hu); TestDecimal(12345678960M, "1.23456790E+10", c9hu); TestDecimal(123456789600M, "1.23456790E+11", c9hu); TestDecimal(1234567896000M, "1.23456790E+12", c9hu); TestDecimal(0.1234567891M, "0.123456789", c9hu); TestDecimal(0.01234567891M, "0.0123456789", c9hu); TestDecimal(0.001234567891M, "0.00123456789", c9hu); TestDecimal(0.0001234567891M, "0.000123456789", c9hu); TestDecimal(0.00001234567891M, "0.0000123456789", c9hu); TestDecimal(0.000001234567891M, "0.00000123456789", c9hu); TestDecimal(0.0000001234567891M, "1.23456789E-7", c9hu); TestDecimal(0.00000001234567891M, "1.23456789E-8", c9hu); TestDecimal(0.000000001234567891M, "1.23456789E-9", c9hu); TestDecimal(0.0000000001234567891M, "1.23456789E-10", c9hu); TestDecimal(0.00000000001234567891M, "1.23456789E-11", c9hu); TestDecimal(0.000000000001234567891M, "1.23456789E-12", c9hu); TestDecimal(0.0000000000001234567891M, "1.23456789E-13", c9hu); TestDecimal(0.00000000000001234567891M, "1.23456789E-14", c9hu); TestDecimal(0.1234567896M, "0.123456790", c9hu); TestDecimal(0.01234567896M, "0.0123456790", c9hu); TestDecimal(0.001234567896M, "0.00123456790", c9hu); TestDecimal(0.0001234567896M, "0.000123456790", c9hu); TestDecimal(0.00001234567896M, "0.0000123456790", c9hu); TestDecimal(0.000001234567896M, "0.00000123456790", c9hu); TestDecimal(0.0000001234567896M, "1.23456790E-7", c9hu); TestDecimal(0.00000001234567896M, "1.23456790E-8", c9hu); TestDecimal(0.000000001234567896M, "1.23456790E-9", c9hu); TestDecimal(0.0000000001234567896M, "1.23456790E-10", c9hu); TestDecimal(0.00000000001234567896M, "1.23456790E-11", c9hu); TestDecimal(0.000000000001234567896M, "1.23456790E-12", c9hu); TestDecimal(0.0000000000001234567896M, "1.23456790E-13", c9hu); TestDecimal(0.00000000000001234567896M, "1.23456790E-14", c9hu); }
public void SpecTestMultiply() { //version: 2.59 //extended: 1 //precision: 9 //rounding: half_up //maxExponent: 384 //minexponent: -383 BigDecimal.Context c6hu = new BigDecimal.Context(6, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c7hu = new BigDecimal.Context(7, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c8hu = new BigDecimal.Context(8, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c9hu = new BigDecimal.Context(9, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c15hu = new BigDecimal.Context(15, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c30hu = new BigDecimal.Context(30, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c33hu = new BigDecimal.Context(33, BigDecimal.RoundingMode.HalfUp); //-- sanity checks (as base, above) TMul("mulx000 multiply 2 2 -> 4", c9hu); TMul("mulx001 multiply 2 3 -> 6", c9hu); TMul("mulx002 multiply 5 1 -> 5", c9hu); TMul("mulx003 multiply 5 2 -> 10", c9hu); TMul("mulx004 multiply 1.20 2 -> 2.40", c9hu); TMul("mulx005 multiply 1.20 0 -> 0.00", c9hu); TMul("mulx006 multiply 1.20 -2 -> -2.40", c9hu); TMul("mulx007 multiply -1.20 2 -> -2.40", c9hu); TMul("mulx008 multiply -1.20 0 -> 0.00", c9hu); // mod: neg 0 TMul("mulx009 multiply -1.20 -2 -> 2.40", c9hu); TMul("mulx010 multiply 5.09 7.1 -> 36.139", c9hu); TMul("mulx011 multiply 2.5 4 -> 10.0", c9hu); TMul("mulx012 multiply 2.50 4 -> 10.00", c9hu); TMul("mulx013 multiply 1.23456789 1.00000000 -> 1.23456789 Rounded", c9hu); TMul("mulx014 multiply 9.999999999 9.999999999 -> 100.000000 Inexact Rounded", c9hu); TMul("mulx015 multiply 2.50 4 -> 10.00", c9hu); //precision: 6 TMul("mulx016 multiply 2.50 4 -> 10.00", c6hu); TMul("mulx017 multiply 9.999999999 9.999999999 -> 100.000 Inexact Rounded", c6hu); TMul("mulx018 multiply 9.999999999 -9.999999999 -> -100.000 Inexact Rounded", c6hu); TMul("mulx019 multiply -9.999999999 9.999999999 -> -100.000 Inexact Rounded", c6hu); TMul("mulx020 multiply -9.999999999 -9.999999999 -> 100.000 Inexact Rounded", c6hu); //-- 1999.12.21: next one is a edge case if intermediate longs are used //precision: 15 TMul("mulx059 multiply 999999999999 9765625 -> 9.76562499999023E+18 Inexact Rounded", c15hu); //precision: 30 TMul("mulx160 multiply 999999999999 9765625 -> 9765624999990234375", c30hu); //precision: 9 //----- //-- zeros, etc. TMul("mulx021 multiply 0 0 -> 0", c9hu); TMul("mulx022 multiply 0 -0 -> 0", c9hu); // mod: neg 0 TMul("mulx023 multiply -0 0 -> 0", c9hu); // mod: neg 0 TMul("mulx024 multiply -0 -0 -> 0", c9hu); TMul("mulx025 multiply -0.0 -0.0 -> 0.00", c9hu); TMul("mulx026 multiply -0.0 -0.0 -> 0.00", c9hu); TMul("mulx027 multiply -0.0 -0.0 -> 0.00", c9hu); TMul("mulx028 multiply -0.0 -0.0 -> 0.00", c9hu); TMul("mulx030 multiply 5.00 1E-3 -> 0.00500", c9hu); TMul("mulx031 multiply 00.00 0.000 -> 0.00000", c9hu); TMul("mulx032 multiply 00.00 0E-3 -> 0.00000 -- rhs is 0", c9hu); TMul("mulx033 multiply 0E-3 00.00 -> 0.00000 -- lhs is 0", c9hu); TMul("mulx034 multiply -5.00 1E-3 -> -0.00500", c9hu); TMul("mulx035 multiply -00.00 0.000 -> 0.00000", c9hu); // mod: neg 0 TMul("mulx036 multiply -00.00 0E-3 -> 0.00000 -- rhs is 0", c9hu); // mod: neg 0 TMul("mulx037 multiply -0E-3 00.00 -> 0.00000 -- lhs is 0", c9hu); // mod: neg 0 TMul("mulx038 multiply 5.00 -1E-3 -> -0.00500", c9hu); TMul("mulx039 multiply 00.00 -0.000 -> 0.00000", c9hu); // mod: neg 0 TMul("mulx040 multiply 00.00 -0E-3 -> 0.00000 -- rhs is 0", c9hu); // mod: neg 0 TMul("mulx041 multiply 0E-3 -00.00 -> 0.00000 -- lhs is 0", c9hu); // mod: neg 0 TMul("mulx042 multiply -5.00 -1E-3 -> 0.00500", c9hu); TMul("mulx043 multiply -00.00 -0.000 -> 0.00000", c9hu); TMul("mulx044 multiply -00.00 -0E-3 -> 0.00000 -- rhs is 0", c9hu); TMul("mulx045 multiply -0E-3 -00.00 -> 0.00000 -- lhs is 0", c9hu); //-- examples from decarith TMul("mulx050 multiply 1.20 3 -> 3.60", c9hu); TMul("mulx051 multiply 7 3 -> 21", c9hu); TMul("mulx052 multiply 0.9 0.8 -> 0.72", c9hu); TMul("mulx053 multiply 0.9 -0 -> 0.0", c9hu); // mod: neg 0 TMul("mulx054 multiply 654321 654321 -> 4.28135971E+11 Inexact Rounded", c9hu); TMul("mulx060 multiply 123.45 1e7 -> 1.2345E+9", c9hu); TMul("mulx061 multiply 123.45 1e8 -> 1.2345E+10", c9hu); TMul("mulx062 multiply 123.45 1e+9 -> 1.2345E+11", c9hu); TMul("mulx063 multiply 123.45 1e10 -> 1.2345E+12", c9hu); TMul("mulx064 multiply 123.45 1e11 -> 1.2345E+13", c9hu); TMul("mulx065 multiply 123.45 1e12 -> 1.2345E+14", c9hu); TMul("mulx066 multiply 123.45 1e13 -> 1.2345E+15", c9hu); //-- test some intermediate lengths //precision: 9 TMul("mulx080 multiply 0.1 123456789 -> 12345678.9", c9hu); TMul("mulx081 multiply 0.1 1234567891 -> 123456789 Inexact Rounded", c9hu); TMul("mulx082 multiply 0.1 12345678912 -> 1.23456789E+9 Inexact Rounded", c9hu); TMul("mulx083 multiply 0.1 12345678912345 -> 1.23456789E+12 Inexact Rounded", c9hu); TMul("mulx084 multiply 0.1 123456789 -> 12345678.9", c9hu); //precision: 8 TMul("mulx085 multiply 0.1 12345678912 -> 1.2345679E+9 Inexact Rounded", c8hu); TMul("mulx086 multiply 0.1 12345678912345 -> 1.2345679E+12 Inexact Rounded", c8hu); //precision: 7 TMul("mulx087 multiply 0.1 12345678912 -> 1.234568E+9 Inexact Rounded", c7hu); TMul("mulx088 multiply 0.1 12345678912345 -> 1.234568E+12 Inexact Rounded", c7hu); //precision: 9 TMul("mulx090 multiply 123456789 0.1 -> 12345678.9", c9hu); TMul("mulx091 multiply 1234567891 0.1 -> 123456789 Inexact Rounded", c9hu); TMul("mulx092 multiply 12345678912 0.1 -> 1.23456789E+9 Inexact Rounded", c9hu); TMul("mulx093 multiply 12345678912345 0.1 -> 1.23456789E+12 Inexact Rounded", c9hu); TMul("mulx094 multiply 123456789 0.1 -> 12345678.9", c9hu); //precision: 8 TMul("mulx095 multiply 12345678912 0.1 -> 1.2345679E+9 Inexact Rounded", c8hu); TMul("mulx096 multiply 12345678912345 0.1 -> 1.2345679E+12 Inexact Rounded", c8hu); //precision: 7 TMul("mulx097 multiply 12345678912 0.1 -> 1.234568E+9 Inexact Rounded", c7hu); TMul("mulx098 multiply 12345678912345 0.1 -> 1.234568E+12 Inexact Rounded", c7hu); //-- test some more edge cases and carries //maxexponent: 9999 //minexponent: -9999 //precision: 33 TMul("mulx101 multiply 9 9 -> 81", c33hu); TMul("mulx102 multiply 9 90 -> 810", c33hu); TMul("mulx103 multiply 9 900 -> 8100", c33hu); TMul("mulx104 multiply 9 9000 -> 81000", c33hu); TMul("mulx105 multiply 9 90000 -> 810000", c33hu); TMul("mulx106 multiply 9 900000 -> 8100000", c33hu); TMul("mulx107 multiply 9 9000000 -> 81000000", c33hu); TMul("mulx108 multiply 9 90000000 -> 810000000", c33hu); TMul("mulx109 multiply 9 900000000 -> 8100000000", c33hu); TMul("mulx110 multiply 9 9000000000 -> 81000000000", c33hu); TMul("mulx111 multiply 9 90000000000 -> 810000000000", c33hu); TMul("mulx112 multiply 9 900000000000 -> 8100000000000", c33hu); TMul("mulx113 multiply 9 9000000000000 -> 81000000000000", c33hu); TMul("mulx114 multiply 9 90000000000000 -> 810000000000000", c33hu); TMul("mulx115 multiply 9 900000000000000 -> 8100000000000000", c33hu); TMul("mulx116 multiply 9 9000000000000000 -> 81000000000000000", c33hu); TMul("mulx117 multiply 9 90000000000000000 -> 810000000000000000", c33hu); TMul("mulx118 multiply 9 900000000000000000 -> 8100000000000000000", c33hu); TMul("mulx119 multiply 9 9000000000000000000 -> 81000000000000000000", c33hu); TMul("mulx120 multiply 9 90000000000000000000 -> 810000000000000000000", c33hu); TMul("mulx121 multiply 9 900000000000000000000 -> 8100000000000000000000", c33hu); TMul("mulx122 multiply 9 9000000000000000000000 -> 81000000000000000000000", c33hu); TMul("mulx123 multiply 9 90000000000000000000000 -> 810000000000000000000000", c33hu); //-- test some more edge cases without carries TMul("mulx131 multiply 3 3 -> 9", c33hu); TMul("mulx132 multiply 3 30 -> 90", c33hu); TMul("mulx133 multiply 3 300 -> 900", c33hu); TMul("mulx134 multiply 3 3000 -> 9000", c33hu); TMul("mulx135 multiply 3 30000 -> 90000", c33hu); TMul("mulx136 multiply 3 300000 -> 900000", c33hu); TMul("mulx137 multiply 3 3000000 -> 9000000", c33hu); TMul("mulx138 multiply 3 30000000 -> 90000000", c33hu); TMul("mulx139 multiply 3 300000000 -> 900000000", c33hu); TMul("mulx140 multiply 3 3000000000 -> 9000000000", c33hu); TMul("mulx141 multiply 3 30000000000 -> 90000000000", c33hu); TMul("mulx142 multiply 3 300000000000 -> 900000000000", c33hu); TMul("mulx143 multiply 3 3000000000000 -> 9000000000000", c33hu); TMul("mulx144 multiply 3 30000000000000 -> 90000000000000", c33hu); TMul("mulx145 multiply 3 300000000000000 -> 900000000000000", c33hu); TMul("mulx146 multiply 3 3000000000000000 -> 9000000000000000", c33hu); TMul("mulx147 multiply 3 30000000000000000 -> 90000000000000000", c33hu); TMul("mulx148 multiply 3 300000000000000000 -> 900000000000000000", c33hu); TMul("mulx149 multiply 3 3000000000000000000 -> 9000000000000000000", c33hu); TMul("mulx150 multiply 3 30000000000000000000 -> 90000000000000000000", c33hu); TMul("mulx151 multiply 3 300000000000000000000 -> 900000000000000000000", c33hu); TMul("mulx152 multiply 3 3000000000000000000000 -> 9000000000000000000000", c33hu); TMul("mulx153 multiply 3 30000000000000000000000 -> 90000000000000000000000", c33hu); //maxexponent: 999999999 //minexponent: -999999999 //precision: 9 //-- test some cases that are close to exponent overflow/underflow TMul("mulx170 multiply 1 9e999999999 -> 9E+999999999", c9hu); TMul("mulx171 multiply 1 9.9e999999999 -> 9.9E+999999999", c9hu); TMul("mulx172 multiply 1 9.99e999999999 -> 9.99E+999999999", c9hu); TMul("mulx173 multiply 9e999999999 1 -> 9E+999999999", c9hu); TMul("mulx174 multiply 9.9e999999999 1 -> 9.9E+999999999", c9hu); TMul("mulx176 multiply 9.99e999999999 1 -> 9.99E+999999999", c9hu); TMul("mulx177 multiply 1 9.99999999e999999999 -> 9.99999999E+999999999", c9hu); TMul("mulx178 multiply 9.99999999e999999999 1 -> 9.99999999E+999999999", c9hu); TMul("mulx180 multiply 0.1 9e-999999998 -> 9E-999999999", c9hu); TMul("mulx181 multiply 0.1 99e-999999998 -> 9.9E-999999998", c9hu); TMul("mulx182 multiply 0.1 999e-999999998 -> 9.99E-999999997", c9hu); TMul("mulx183 multiply 0.1 9e-999999998 -> 9E-999999999", c9hu); TMul("mulx184 multiply 0.1 99e-999999998 -> 9.9E-999999998", c9hu); TMul("mulx185 multiply 0.1 999e-999999998 -> 9.99E-999999997", c9hu); TMul("mulx186 multiply 0.1 999e-999999997 -> 9.99E-999999996", c9hu); TMul("mulx187 multiply 0.1 9999e-999999997 -> 9.999E-999999995", c9hu); TMul("mulx188 multiply 0.1 99999e-999999997 -> 9.9999E-999999994", c9hu); TMul("mulx190 multiply 1 9e-999999998 -> 9E-999999998", c9hu); TMul("mulx191 multiply 1 99e-999999998 -> 9.9E-999999997", c9hu); TMul("mulx192 multiply 1 999e-999999998 -> 9.99E-999999996", c9hu); TMul("mulx193 multiply 9e-999999998 1 -> 9E-999999998", c9hu); TMul("mulx194 multiply 99e-999999998 1 -> 9.9E-999999997", c9hu); TMul("mulx195 multiply 999e-999999998 1 -> 9.99E-999999996", c9hu); TMul("mulx196 multiply 1e-599999999 1e-400000000 -> 1E-999999999", c9hu); TMul("mulx197 multiply 1e-600000000 1e-399999999 -> 1E-999999999", c9hu); TMul("mulx198 multiply 1.2e-599999999 1.2e-400000000 -> 1.44E-999999999", c9hu); TMul("mulx199 multiply 1.2e-600000000 1.2e-399999999 -> 1.44E-999999999", c9hu); TMul("mulx201 multiply 1e599999999 1e400000000 -> 1E+999999999", c9hu); TMul("mulx202 multiply 1e600000000 1e399999999 -> 1E+999999999", c9hu); TMul("mulx203 multiply 1.2e599999999 1.2e400000000 -> 1.44E+999999999", c9hu); TMul("mulx204 multiply 1.2e600000000 1.2e399999999 -> 1.44E+999999999", c9hu); //-- long operand triangle //precision: 33 TMul("mulx246 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193369671916511992830 Inexact Rounded", new BigDecimal.Context(33, BigDecimal.RoundingMode.HalfUp)); //precision: 32 TMul("mulx247 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119336967191651199283 Inexact Rounded", new BigDecimal.Context(32, BigDecimal.RoundingMode.HalfUp)); //precision: 31 TMul("mulx248 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908011933696719165119928 Inexact Rounded", new BigDecimal.Context(31, BigDecimal.RoundingMode.HalfUp)); //precision: 30 TMul("mulx249 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193369671916511993 Inexact Rounded", new BigDecimal.Context(30, BigDecimal.RoundingMode.HalfUp)); //precision: 29 TMul("mulx250 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119336967191651199 Inexact Rounded", new BigDecimal.Context(29, BigDecimal.RoundingMode.HalfUp)); //precision: 28 TMul("mulx251 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908011933696719165120 Inexact Rounded", new BigDecimal.Context(28, BigDecimal.RoundingMode.HalfUp)); //precision: 27 TMul("mulx252 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193369671916512 Inexact Rounded", new BigDecimal.Context(27, BigDecimal.RoundingMode.HalfUp)); //precision: 26 TMul("mulx253 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119336967191651 Inexact Rounded", new BigDecimal.Context(26, BigDecimal.RoundingMode.HalfUp)); //precision: 25 TMul("mulx254 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908011933696719165 Inexact Rounded", new BigDecimal.Context(25, BigDecimal.RoundingMode.HalfUp)); //precision: 24 TMul("mulx255 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193369671917 Inexact Rounded", new BigDecimal.Context(24, BigDecimal.RoundingMode.HalfUp)); //precision: 23 TMul("mulx256 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119336967192 Inexact Rounded", new BigDecimal.Context(23, BigDecimal.RoundingMode.HalfUp)); //precision: 22 TMul("mulx257 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908011933696719 Inexact Rounded", new BigDecimal.Context(22, BigDecimal.RoundingMode.HalfUp)); //precision: 21 TMul("mulx258 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193369672 Inexact Rounded", new BigDecimal.Context(21, BigDecimal.RoundingMode.HalfUp)); //precision: 20 TMul("mulx259 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119336967 Inexact Rounded", new BigDecimal.Context(20, BigDecimal.RoundingMode.HalfUp)); //precision: 19 TMul("mulx260 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908011933697 Inexact Rounded", new BigDecimal.Context(19, BigDecimal.RoundingMode.HalfUp)); //precision: 18 TMul("mulx261 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193370 Inexact Rounded", new BigDecimal.Context(18, BigDecimal.RoundingMode.HalfUp)); //precision: 17 TMul("mulx262 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119337 Inexact Rounded", new BigDecimal.Context(17, BigDecimal.RoundingMode.HalfUp)); //precision: 16 TMul("mulx263 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908011934 Inexact Rounded", new BigDecimal.Context(16, BigDecimal.RoundingMode.HalfUp)); //precision: 15 TMul("mulx264 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801193 Inexact Rounded", new BigDecimal.Context(15, BigDecimal.RoundingMode.HalfUp)); //precision: 14 TMul("mulx265 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080119 Inexact Rounded", new BigDecimal.Context(14, BigDecimal.RoundingMode.HalfUp)); //precision: 13 TMul("mulx266 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908012 Inexact Rounded", new BigDecimal.Context(13, BigDecimal.RoundingMode.HalfUp)); //precision: 12 TMul("mulx267 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.290801 Inexact Rounded", new BigDecimal.Context(12, BigDecimal.RoundingMode.HalfUp)); //precision: 11 TMul("mulx268 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29080 Inexact Rounded", new BigDecimal.Context(11, BigDecimal.RoundingMode.HalfUp)); //precision: 10 TMul("mulx269 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.2908 Inexact Rounded", new BigDecimal.Context(10, BigDecimal.RoundingMode.HalfUp)); //precision: 9 TMul("mulx270 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.291 Inexact Rounded", new BigDecimal.Context(9, BigDecimal.RoundingMode.HalfUp)); //precision: 8 TMul("mulx271 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.29 Inexact Rounded", new BigDecimal.Context(8, BigDecimal.RoundingMode.HalfUp)); //precision: 7 TMul("mulx272 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433.3 Inexact Rounded", new BigDecimal.Context(7, BigDecimal.RoundingMode.HalfUp)); //precision: 6 TMul("mulx273 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 145433 Inexact Rounded", new BigDecimal.Context(6, BigDecimal.RoundingMode.HalfUp)); //precision: 5 TMul("mulx274 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 1.4543E+5 Inexact Rounded", new BigDecimal.Context(5, BigDecimal.RoundingMode.HalfUp)); //precision: 4 TMul("mulx275 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 1.454E+5 Inexact Rounded", new BigDecimal.Context(4, BigDecimal.RoundingMode.HalfUp)); //precision: 3 TMul("mulx276 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 1.45E+5 Inexact Rounded", new BigDecimal.Context(3, BigDecimal.RoundingMode.HalfUp)); //precision: 2 TMul("mulx277 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 1.5E+5 Inexact Rounded", new BigDecimal.Context(2, BigDecimal.RoundingMode.HalfUp)); //precision: 1 TMul("mulx278 multiply 30269.587755640502150977251770554 4.8046009735990873395936309640543 -> 1E+5 Inexact Rounded", new BigDecimal.Context(1, BigDecimal.RoundingMode.HalfUp)); //-- test some edge cases with exact rounding //maxexponent: 9999 //minexponent: -9999 //precision: 9 TMul("mulx301 multiply 9 9 -> 81", c9hu); TMul("mulx302 multiply 9 90 -> 810", c9hu); TMul("mulx303 multiply 9 900 -> 8100", c9hu); TMul("mulx304 multiply 9 9000 -> 81000", c9hu); TMul("mulx305 multiply 9 90000 -> 810000", c9hu); TMul("mulx306 multiply 9 900000 -> 8100000", c9hu); TMul("mulx307 multiply 9 9000000 -> 81000000", c9hu); TMul("mulx308 multiply 9 90000000 -> 810000000", c9hu); TMul("mulx309 multiply 9 900000000 -> 8.10000000E+9 Rounded", c9hu); TMul("mulx310 multiply 9 9000000000 -> 8.10000000E+10 Rounded", c9hu); TMul("mulx311 multiply 9 90000000000 -> 8.10000000E+11 Rounded", c9hu); TMul("mulx312 multiply 9 900000000000 -> 8.10000000E+12 Rounded", c9hu); TMul("mulx313 multiply 9 9000000000000 -> 8.10000000E+13 Rounded", c9hu); TMul("mulx314 multiply 9 90000000000000 -> 8.10000000E+14 Rounded", c9hu); TMul("mulx315 multiply 9 900000000000000 -> 8.10000000E+15 Rounded", c9hu); TMul("mulx316 multiply 9 9000000000000000 -> 8.10000000E+16 Rounded", c9hu); TMul("mulx317 multiply 9 90000000000000000 -> 8.10000000E+17 Rounded", c9hu); TMul("mulx318 multiply 9 900000000000000000 -> 8.10000000E+18 Rounded", c9hu); TMul("mulx319 multiply 9 9000000000000000000 -> 8.10000000E+19 Rounded", c9hu); TMul("mulx320 multiply 9 90000000000000000000 -> 8.10000000E+20 Rounded", c9hu); TMul("mulx321 multiply 9 900000000000000000000 -> 8.10000000E+21 Rounded", c9hu); TMul("mulx322 multiply 9 9000000000000000000000 -> 8.10000000E+22 Rounded", c9hu); TMul("mulx323 multiply 9 90000000000000000000000 -> 8.10000000E+23 Rounded", c9hu); //-- fastpath breakers //precision: 29 TMul("mulx330 multiply 1.491824697641270317824852952837224 1.105170918075647624811707826490246514675628614562883537345747603 -> 1.6487212707001281468486507878 Inexact Rounded", new BigDecimal.Context(29, BigDecimal.RoundingMode.HalfUp)); //precision: 55 TMul("mulx331 multiply 0.8958341352965282506768545828765117803873717284891040428 0.8958341352965282506768545828765117803873717284891040428 -> 0.8025187979624784829842553829934069955890983696752228299 Inexact Rounded", new BigDecimal.Context(55, BigDecimal.RoundingMode.HalfUp)); //-- tryzeros cases //precision: 7 //rounding: half_up //maxExponent: 92 //minexponent: -92 //TMul("mulx504 multiply 0E-60 1000E-60 -> 0E-98 Clamped", new BigDecimal.Context(7, BigDecimal.RoundingMode.HalfUp)); //TMul("mulx505 multiply 100E+60 0E+60 -> 0E+92 Clamped", new BigDecimal.Context(7, BigDecimal.RoundingMode.HalfUp)); //-- mixed with zeros //maxexponent: 999999999 //minexponent: -999999999 //precision: 9 TMul("mulx541 multiply 0 -1 -> 0", c9hu); // mod: neg zero TMul("mulx542 multiply -0 -1 -> 0", c9hu); TMul("mulx543 multiply 0 1 -> 0", c9hu); TMul("mulx544 multiply -0 1 -> 0", c9hu); // mod: neg zero TMul("mulx545 multiply -1 0 -> 0", c9hu); // mod: neg zero TMul("mulx546 multiply -1 -0 -> 0", c9hu); TMul("mulx547 multiply 1 0 -> 0", c9hu); TMul("mulx548 multiply 1 -0 -> 0", c9hu); // mod: neg zero TMul("mulx551 multiply 0.0 -1 -> 0.0", c9hu); // mod: neg zero TMul("mulx552 multiply -0.0 -1 -> 0.0", c9hu); TMul("mulx553 multiply 0.0 1 -> 0.0", c9hu); TMul("mulx554 multiply -0.0 1 -> 0.0", c9hu); // mod: neg zero TMul("mulx555 multiply -1.0 0 -> 0.0", c9hu); // mod: neg zero TMul("mulx556 multiply -1.0 -0 -> 0.0", c9hu); TMul("mulx557 multiply 1.0 0 -> 0.0", c9hu); TMul("mulx558 multiply 1.0 -0 -> 0.0", c9hu); // mod: neg zero TMul("mulx561 multiply 0 -1.0 -> 0.0", c9hu); // mod: neg zero TMul("mulx562 multiply -0 -1.0 -> 0.0", c9hu); TMul("mulx563 multiply 0 1.0 -> 0.0", c9hu); TMul("mulx564 multiply -0 1.0 -> 0.0", c9hu); // mod: neg zero TMul("mulx565 multiply -1 0.0 -> 0.0", c9hu); // mod: neg zero TMul("mulx566 multiply -1 -0.0 -> 0.0", c9hu); TMul("mulx567 multiply 1 0.0 -> 0.0", c9hu); TMul("mulx568 multiply 1 -0.0 -> 0.0", c9hu); // mod: neg zero TMul("mulx571 multiply 0.0 -1.0 -> 0.00", c9hu); // mod: neg zero TMul("mulx572 multiply -0.0 -1.0 -> 0.00", c9hu); TMul("mulx573 multiply 0.0 1.0 -> 0.00", c9hu); TMul("mulx574 multiply -0.0 1.0 -> 0.00", c9hu); // mod: neg zero TMul("mulx575 multiply -1.0 0.0 -> 0.00", c9hu); // mod: neg zero TMul("mulx576 multiply -1.0 -0.0 -> 0.00", c9hu); TMul("mulx577 multiply 1.0 0.0 -> 0.00", c9hu); TMul("mulx578 multiply 1.0 -0.0 -> 0.00", c9hu); // mod: neg zero //-- Specials //-- test subnormals rounding //precision: 5 //maxExponent: 999 //minexponent: -999 //rounding: half_even //... }
void TestBasicRounding(string bdStr,uint precision, BigDecimal.RoundingMode mode, string biStr, int exponent) { BigDecimal.Context mc = new BigDecimal.Context(precision,mode); BigDecimal bd = BigDecimal.Parse(bdStr); BigDecimal br = BigDecimal.Round(bd,mc); Expect(br.Coefficient, EqualTo(BigInteger.Parse(biStr))); Expect(br.Exponent, EqualTo(exponent)); }
public void TestBadDivides() { BigDecimal.Context c16hu = new BigDecimal.Context(16, BigDecimal.RoundingMode.HalfUp); TDivEx("divx732 divide 00.00 0.000 -> NaN Division_undefined", c16hu); TDivEx("divx733 divide 00.00 0E-3 -> NaN Division_undefined", c16hu); TDivEx("divx734 divide 0 -0 -> NaN Division_undefined", c16hu); TDivEx("divx735 divide -0 0 -> NaN Division_undefined", c16hu); TDivEx("divx736 divide -0 -0 -> NaN Division_undefined", c16hu); TDivEx("divx745 divide -1 0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx746 divide -1 -0 -> Infinity Division_by_zero", c16hu); TDivEx("divx747 divide 1 0 -> Infinity Division_by_zero", c16hu); TDivEx("divx748 divide 1 -0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx755 divide -1.0 0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx756 divide -1.0 -0 -> Infinity Division_by_zero", c16hu); TDivEx("divx757 divide 1.0 0 -> Infinity Division_by_zero", c16hu); TDivEx("divx758 divide 1.0 -0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx765 divide -1 0.0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx766 divide -1 -0.0 -> Infinity Division_by_zero", c16hu); TDivEx("divx767 divide 1 0.0 -> Infinity Division_by_zero", c16hu); TDivEx("divx768 divide 1 -0.0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx775 divide -1.0 0.0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx776 divide -1.0 -0.0 -> Infinity Division_by_zero", c16hu); TDivEx("divx777 divide 1.0 0.0 -> Infinity Division_by_zero", c16hu); TDivEx("divx778 divide 1.0 -0.0 -> -Infinity Division_by_zero ", c16hu); //-- Various flavours of divide by 0 TDivEx("divx901 divide 0 0 -> NaN Division_undefined", c16hu); TDivEx("divx902 divide 0.0E5 0 -> NaN Division_undefined", c16hu); TDivEx("divx903 divide 0.000 0 -> NaN Division_undefined", c16hu); TDivEx("divx904 divide 0.0001 0 -> Infinity Division_by_zero", c16hu); TDivEx("divx905 divide 0.01 0 -> Infinity Division_by_zero", c16hu); TDivEx("divx906 divide 0.1 0 -> Infinity Division_by_zero", c16hu); TDivEx("divx907 divide 1 0 -> Infinity Division_by_zero", c16hu); TDivEx("divx908 divide 1 0.0 -> Infinity Division_by_zero", c16hu); TDivEx("divx909 divide 10 0.0 -> Infinity Division_by_zero", c16hu); TDivEx("divx910 divide 1E+100 0.0 -> Infinity Division_by_zero", c16hu); TDivEx("divx911 divide 1E+1000 0 -> Infinity Division_by_zero", c16hu); TDivEx("divx921 divide -0.0001 0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx922 divide -0.01 0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx923 divide -0.1 0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx924 divide -1 0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx925 divide -1 0.0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx926 divide -10 0.0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx927 divide -1E+100 0.0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx928 divide -1E+1000 0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx931 divide 0.0001 -0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx932 divide 0.01 -0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx933 divide 0.1 -0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx934 divide 1 -0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx935 divide 1 -0.0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx936 divide 10 -0.0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx937 divide 1E+100 -0.0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx938 divide 1E+1000 -0 -> -Infinity Division_by_zero", c16hu); TDivEx("divx941 divide -0.0001 -0 -> Infinity Division_by_zero", c16hu); TDivEx("divx942 divide -0.01 -0 -> Infinity Division_by_zero", c16hu); TDivEx("divx943 divide -0.1 -0 -> Infinity Division_by_zero", c16hu); TDivEx("divx944 divide -1 -0 -> Infinity Division_by_zero", c16hu); TDivEx("divx945 divide -1 -0.0 -> Infinity Division_by_zero", c16hu); TDivEx("divx946 divide -10 -0.0 -> Infinity Division_by_zero", c16hu); TDivEx("divx947 divide -1E+100 -0.0 -> Infinity Division_by_zero", c16hu); TDivEx("divx948 divide -1E+1000 -0 -> Infinity Division_by_zero", c16hu); }
public void TestSpecDivide() { BigDecimal.Context c9hu = new BigDecimal.Context(9, BigDecimal.RoundingMode.HalfUp); //version: 2.59 //extended: 1 //precision: 9 //rounding: half_up //maxExponent: 384 //minexponent: -383 //-- sanity checks TDiv("divx001 divide 1 1 -> 1", c9hu); TDiv("divx002 divide 2 1 -> 2", c9hu); TDiv("divx003 divide 1 2 -> 0.5", c9hu); TDiv("divx004 divide 2 2 -> 1", c9hu); TDiv("divx005 divide 0 1 -> 0", c9hu); TDiv("divx006 divide 0 2 -> 0", c9hu); TDiv("divx007 divide 1 3 -> 0.333333333 Inexact Rounded", c9hu); TDiv("divx008 divide 2 3 -> 0.666666667 Inexact Rounded", c9hu); TDiv("divx009 divide 3 3 -> 1", c9hu); TDiv("divx010 divide 2.4 1 -> 2.4", c9hu); TDiv("divx011 divide 2.4 -1 -> -2.4", c9hu); TDiv("divx012 divide -2.4 1 -> -2.4", c9hu); TDiv("divx013 divide -2.4 -1 -> 2.4", c9hu); TDiv("divx014 divide 2.40 1 -> 2.40", c9hu); TDiv("divx015 divide 2.400 1 -> 2.400", c9hu); TDiv("divx016 divide 2.4 2 -> 1.2", c9hu); TDiv("divx017 divide 2.400 2 -> 1.200", c9hu); TDiv("divx018 divide 2. 2 -> 1", c9hu); TDiv("divx019 divide 20 20 -> 1", c9hu); TDiv("divx020 divide 187 187 -> 1", c9hu); TDiv("divx021 divide 5 2 -> 2.5", c9hu); TDiv("divx022 divide 50 20 -> 2.5", c9hu); TDiv("divx023 divide 500 200 -> 2.5", c9hu); TDiv("divx024 divide 50.0 20.0 -> 2.5", c9hu); TDiv("divx025 divide 5.00 2.00 -> 2.5", c9hu); TDiv("divx026 divide 5 2.0 -> 2.5", c9hu); TDiv("divx027 divide 5 2.000 -> 2.5", c9hu); TDiv("divx028 divide 5 0.20 -> 25", c9hu); TDiv("divx029 divide 5 0.200 -> 25", c9hu); TDiv("divx030 divide 10 1 -> 10", c9hu); TDiv("divx031 divide 100 1 -> 100", c9hu); TDiv("divx032 divide 1000 1 -> 1000", c9hu); TDiv("divx033 divide 1000 100 -> 10", c9hu); TDiv("divx035 divide 1 2 -> 0.5", c9hu); TDiv("divx036 divide 1 4 -> 0.25", c9hu); TDiv("divx037 divide 1 8 -> 0.125", c9hu); TDiv("divx038 divide 1 16 -> 0.0625", c9hu); TDiv("divx039 divide 1 32 -> 0.03125", c9hu); TDiv("divx040 divide 1 64 -> 0.015625", c9hu); TDiv("divx041 divide 1 -2 -> -0.5", c9hu); TDiv("divx042 divide 1 -4 -> -0.25", c9hu); TDiv("divx043 divide 1 -8 -> -0.125", c9hu); TDiv("divx044 divide 1 -16 -> -0.0625", c9hu); TDiv("divx045 divide 1 -32 -> -0.03125", c9hu); TDiv("divx046 divide 1 -64 -> -0.015625", c9hu); TDiv("divx047 divide -1 2 -> -0.5", c9hu); TDiv("divx048 divide -1 4 -> -0.25", c9hu); TDiv("divx049 divide -1 8 -> -0.125", c9hu); TDiv("divx050 divide -1 16 -> -0.0625", c9hu); TDiv("divx051 divide -1 32 -> -0.03125", c9hu); TDiv("divx052 divide -1 64 -> -0.015625", c9hu); TDiv("divx053 divide -1 -2 -> 0.5", c9hu); TDiv("divx054 divide -1 -4 -> 0.25", c9hu); TDiv("divx055 divide -1 -8 -> 0.125", c9hu); TDiv("divx056 divide -1 -16 -> 0.0625", c9hu); TDiv("divx057 divide -1 -32 -> 0.03125", c9hu); TDiv("divx058 divide -1 -64 -> 0.015625", c9hu); TDiv("divx070 divide 999999999 1 -> 999999999", c9hu); TDiv("divx071 divide 999999999.4 1 -> 999999999 Inexact Rounded", c9hu); TDiv("divx072 divide 999999999.5 1 -> 1.00000000E+9 Inexact Rounded", c9hu); TDiv("divx073 divide 999999999.9 1 -> 1.00000000E+9 Inexact Rounded", c9hu); TDiv("divx074 divide 999999999.999 1 -> 1.00000000E+9 Inexact Rounded", c9hu); //precision: 6 BigDecimal.Context c6hu = new BigDecimal.Context(6, BigDecimal.RoundingMode.HalfUp); TDiv("divx080 divide 999999999 1 -> 1.00000E+9 Inexact Rounded", c6hu); TDiv("divx081 divide 99999999 1 -> 1.00000E+8 Inexact Rounded", c6hu); TDiv("divx082 divide 9999999 1 -> 1.00000E+7 Inexact Rounded", c6hu); TDiv("divx083 divide 999999 1 -> 999999", c6hu); TDiv("divx084 divide 99999 1 -> 99999", c6hu); TDiv("divx085 divide 9999 1 -> 9999", c6hu); TDiv("divx086 divide 999 1 -> 999", c6hu); TDiv("divx087 divide 99 1 -> 99", c6hu); TDiv("divx088 divide 9 1 -> 9", c6hu); //precision: 9 TDiv("divx090 divide 0. 1 -> 0", c9hu); TDiv("divx091 divide .0 1 -> 0.0", c9hu); TDiv("divx092 divide 0.00 1 -> 0.00", c9hu); TDiv("divx093 divide 0.00E+9 1 -> 0E+7", c9hu); TDiv("divx094 divide 0.0000E-50 1 -> 0E-54", c9hu); TDiv("divx095 divide 1 1E-8 -> 1E+8", c9hu); TDiv("divx096 divide 1 1E-9 -> 1E+9", c9hu); TDiv("divx097 divide 1 1E-10 -> 1E+10", c9hu); TDiv("divx098 divide 1 1E-11 -> 1E+11", c9hu); TDiv("divx099 divide 1 1E-12 -> 1E+12", c9hu); TDiv("divx100 divide 1 1 -> 1", c9hu); TDiv("divx101 divide 1 2 -> 0.5", c9hu); TDiv("divx102 divide 1 3 -> 0.333333333 Inexact Rounded", c9hu); TDiv("divx103 divide 1 4 -> 0.25", c9hu); TDiv("divx104 divide 1 5 -> 0.2", c9hu); TDiv("divx105 divide 1 6 -> 0.166666667 Inexact Rounded", c9hu); TDiv("divx106 divide 1 7 -> 0.142857143 Inexact Rounded", c9hu); TDiv("divx107 divide 1 8 -> 0.125", c9hu); TDiv("divx108 divide 1 9 -> 0.111111111 Inexact Rounded", c9hu); TDiv("divx109 divide 1 10 -> 0.1", c9hu); TDiv("divx110 divide 1 1 -> 1", c9hu); TDiv("divx111 divide 2 1 -> 2", c9hu); TDiv("divx112 divide 3 1 -> 3", c9hu); TDiv("divx113 divide 4 1 -> 4", c9hu); TDiv("divx114 divide 5 1 -> 5", c9hu); TDiv("divx115 divide 6 1 -> 6", c9hu); TDiv("divx116 divide 7 1 -> 7", c9hu); TDiv("divx117 divide 8 1 -> 8", c9hu); TDiv("divx118 divide 9 1 -> 9", c9hu); TDiv("divx119 divide 10 1 -> 10", c9hu); TDiv("divx120 divide 3E+1 0.001 -> 3E+4", c9hu); TDiv("divx121 divide 2.200 2 -> 1.100", c9hu); TDiv("divx130 divide 12345 4.999 -> 2469.49390 Inexact Rounded", c9hu); TDiv("divx131 divide 12345 4.99 -> 2473.94790 Inexact Rounded", c9hu); TDiv("divx132 divide 12345 4.9 -> 2519.38776 Inexact Rounded", c9hu); TDiv("divx133 divide 12345 5 -> 2469", c9hu); TDiv("divx134 divide 12345 5.1 -> 2420.58824 Inexact Rounded", c9hu); TDiv("divx135 divide 12345 5.01 -> 2464.07186 Inexact Rounded", c9hu); TDiv("divx136 divide 12345 5.001 -> 2468.50630 Inexact Rounded", c9hu); //precision: 9 //maxexponent: 999999999 //minexponent: -999999999 //-- test possibly imprecise results TDiv("divx220 divide 391 597 -> 0.654941374 Inexact Rounded", c9hu); TDiv("divx221 divide 391 -597 -> -0.654941374 Inexact Rounded", c9hu); TDiv("divx222 divide -391 597 -> -0.654941374 Inexact Rounded", c9hu); TDiv("divx223 divide -391 -597 -> 0.654941374 Inexact Rounded", c9hu); //-- test some cases that are close to exponent overflow //maxexponent: 999999999 //minexponent: -999999999 TDiv("divx270 divide 1 1e999999999 -> 1E-999999999", c9hu); TDiv("divx271 divide 1 0.9e999999999 -> 1.11111111E-999999999 Inexact Rounded", c9hu); TDiv("divx272 divide 1 0.99e999999999 -> 1.01010101E-999999999 Inexact Rounded", c9hu); TDiv("divx273 divide 1 0.999999999e999999999 -> 1.00000000E-999999999 Inexact Rounded", c9hu); TDiv("divx274 divide 9e999999999 1 -> 9E+999999999", c9hu); TDiv("divx275 divide 9.9e999999999 1 -> 9.9E+999999999", c9hu); TDiv("divx276 divide 9.99e999999999 1 -> 9.99E+999999999", c9hu); TDiv("divx277 divide 9.99999999e999999999 1 -> 9.99999999E+999999999", c9hu); TDiv("divx280 divide 0.1 9e-999999999 -> 1.11111111E+999999997 Inexact Rounded", c9hu); TDiv("divx281 divide 0.1 99e-999999999 -> 1.01010101E+999999996 Inexact Rounded", c9hu); TDiv("divx282 divide 0.1 999e-999999999 -> 1.00100100E+999999995 Inexact Rounded", c9hu); TDiv("divx283 divide 0.1 9e-999999998 -> 1.11111111E+999999996 Inexact Rounded", c9hu); TDiv("divx284 divide 0.1 99e-999999998 -> 1.01010101E+999999995 Inexact Rounded", c9hu); TDiv("divx285 divide 0.1 999e-999999998 -> 1.00100100E+999999994 Inexact Rounded", c9hu); TDiv("divx286 divide 0.1 999e-999999997 -> 1.00100100E+999999993 Inexact Rounded", c9hu); TDiv("divx287 divide 0.1 9999e-999999997 -> 1.00010001E+999999992 Inexact Rounded", c9hu); TDiv("divx288 divide 0.1 99999e-999999997 -> 1.00001000E+999999991 Inexact Rounded", c9hu); //-- Divide into 0 tests TDiv("divx301 divide 0 7 -> 0", c9hu); TDiv("divx302 divide 0 7E-5 -> 0E+5", c9hu); TDiv("divx303 divide 0 7E-1 -> 0E+1", c9hu); TDiv("divx304 divide 0 7E+1 -> 0.0", c9hu); TDiv("divx305 divide 0 7E+5 -> 0.00000", c9hu); TDiv("divx306 divide 0 7E+6 -> 0.000000", c9hu); TDiv("divx307 divide 0 7E+7 -> 0E-7", c9hu); TDiv("divx308 divide 0 70E-5 -> 0E+5", c9hu); TDiv("divx309 divide 0 70E-1 -> 0E+1", c9hu); TDiv("divx310 divide 0 70E+0 -> 0", c9hu); TDiv("divx311 divide 0 70E+1 -> 0.0", c9hu); TDiv("divx312 divide 0 70E+5 -> 0.00000", c9hu); TDiv("divx313 divide 0 70E+6 -> 0.000000", c9hu); TDiv("divx314 divide 0 70E+7 -> 0E-7", c9hu); TDiv("divx315 divide 0 700E-5 -> 0E+5", c9hu); TDiv("divx316 divide 0 700E-1 -> 0E+1", c9hu); TDiv("divx317 divide 0 700E+0 -> 0", c9hu); TDiv("divx318 divide 0 700E+1 -> 0.0", c9hu); TDiv("divx319 divide 0 700E+5 -> 0.00000", c9hu); TDiv("divx320 divide 0 700E+6 -> 0.000000", c9hu); TDiv("divx321 divide 0 700E+7 -> 0E-7", c9hu); TDiv("divx322 divide 0 700E+77 -> 0E-77", c9hu); TDiv("divx331 divide 0E-3 7E-5 -> 0E+2", c9hu); TDiv("divx332 divide 0E-3 7E-1 -> 0.00", c9hu); TDiv("divx333 divide 0E-3 7E+1 -> 0.0000", c9hu); TDiv("divx334 divide 0E-3 7E+5 -> 0E-8", c9hu); TDiv("divx335 divide 0E-1 7E-5 -> 0E+4", c9hu); TDiv("divx336 divide 0E-1 7E-1 -> 0", c9hu); TDiv("divx337 divide 0E-1 7E+1 -> 0.00", c9hu); TDiv("divx338 divide 0E-1 7E+5 -> 0.000000", c9hu); TDiv("divx339 divide 0E+1 7E-5 -> 0E+6", c9hu); TDiv("divx340 divide 0E+1 7E-1 -> 0E+2", c9hu); TDiv("divx341 divide 0E+1 7E+1 -> 0", c9hu); TDiv("divx342 divide 0E+1 7E+5 -> 0.0000", c9hu); TDiv("divx343 divide 0E+3 7E-5 -> 0E+8", c9hu); TDiv("divx344 divide 0E+3 7E-1 -> 0E+4", c9hu); TDiv("divx345 divide 0E+3 7E+1 -> 0E+2", c9hu); TDiv("divx346 divide 0E+3 7E+5 -> 0.00", c9hu); //maxexponent: 92 //minexponent: -92 //precision: 7 BigDecimal.Context c7hu = new BigDecimal.Context(7, BigDecimal.RoundingMode.HalfUp); TDiv("divx351 divide 0E-92 7E-1 -> 0E-91", c7hu); TDiv("divx352 divide 0E-92 7E+1 -> 0E-93", c7hu); TDiv("divx353 divide 0E-92 7E+5 -> 0E-97", c7hu); TDiv("divx354 divide 0E-92 7E+6 -> 0E-98", c7hu); //TDiv("divx355 divide 0E-92 7E+7 -> 0E-98 Clamped", c7hu); TDiv("divx356 divide 0E-92 777E-1 -> 0E-91", c7hu); TDiv("divx357 divide 0E-92 777E+1 -> 0E-93", c7hu); TDiv("divx358 divide 0E-92 777E+3 -> 0E-95", c7hu); TDiv("divx359 divide 0E-92 777E+4 -> 0E-96", c7hu); TDiv("divx360 divide 0E-92 777E+5 -> 0E-97", c7hu); TDiv("divx361 divide 0E-92 777E+6 -> 0E-98", c7hu); //TDiv("divx362 divide 0E-92 777E+7 -> 0E-98 Clamped", c7hu); //TDiv("divx363 divide 0E-92 7E+92 -> 0E-98 Clamped", c7hu); TDiv("divx371 divide 0E-92 700E-1 -> 0E-91", c7hu); TDiv("divx372 divide 0E-92 700E+1 -> 0E-93", c7hu); TDiv("divx373 divide 0E-92 700E+3 -> 0E-95", c7hu); TDiv("divx374 divide 0E-92 700E+4 -> 0E-96", c7hu); TDiv("divx375 divide 0E-92 700E+5 -> 0E-97", c7hu); TDiv("divx376 divide 0E-92 700E+6 -> 0E-98", c7hu); //TDiv("divx377 divide 0E-92 700E+7 -> 0E-98 Clamped", c7hu); TDiv("divx381 divide 0E+92 7E+1 -> 0E+91", c7hu); TDiv("divx382 divide 0E+92 7E+0 -> 0E+92", c7hu); //TDiv("divx383 divide 0E+92 7E-1 -> 0E+92 Clamped", c7hu); TDiv("divx384 divide 0E+90 777E+1 -> 0E+89", c7hu); TDiv("divx385 divide 0E+90 777E-1 -> 0E+91", c7hu); TDiv("divx386 divide 0E+90 777E-2 -> 0E+92", c7hu); //TDiv("divx387 divide 0E+90 777E-3 -> 0E+92 Clamped", c7hu); //TDiv("divx388 divide 0E+90 777E-4 -> 0E+92 Clamped", c7hu); TDiv("divx391 divide 0E+90 700E+1 -> 0E+89", c7hu); TDiv("divx392 divide 0E+90 700E-1 -> 0E+91", c7hu); TDiv("divx393 divide 0E+90 700E-2 -> 0E+92", c7hu); //TDiv("divx394 divide 0E+90 700E-3 -> 0E+92 Clamped", c7hu); //TDiv("divx395 divide 0E+90 700E-4 -> 0E+92 Clamped", c7hu); //-- input rounding checks //maxexponent: 999 //minexponent: -999 //precision: 9 TDiv("divx401 divide 12345678000 1 -> 1.23456780E+10 Rounded", c9hu); TDiv("divx402 divide 1 12345678000 -> 8.10000066E-11 Inexact Rounded", c9hu); TDiv("divx403 divide 1234567800 1 -> 1.23456780E+9 Rounded", c9hu); TDiv("divx404 divide 1 1234567800 -> 8.10000066E-10 Inexact Rounded", c9hu); TDiv("divx405 divide 1234567890 1 -> 1.23456789E+9 Rounded", c9hu); TDiv("divx406 divide 1 1234567890 -> 8.10000007E-10 Inexact Rounded", c9hu); TDiv("divx407 divide 1234567891 1 -> 1.23456789E+9 Inexact Rounded", c9hu); TDiv("divx408 divide 1 1234567891 -> 8.10000007E-10 Inexact Rounded", c9hu); TDiv("divx409 divide 12345678901 1 -> 1.23456789E+10 Inexact Rounded", c9hu); TDiv("divx410 divide 1 12345678901 -> 8.10000007E-11 Inexact Rounded", c9hu); TDiv("divx411 divide 1234567896 1 -> 1.23456790E+9 Inexact Rounded", c9hu); TDiv("divx412 divide 1 1234567896 -> 8.10000003E-10 Inexact Rounded", c9hu); TDiv("divx413 divide 1 1234567897 -> 8.10000003E-10 Inexact Rounded", c9hu); TDiv("divx414 divide 1 1234567898 -> 8.10000002E-10 Inexact Rounded", c9hu); TDiv("divx415 divide 1 1234567899 -> 8.10000001E-10 Inexact Rounded", c9hu); TDiv("divx416 divide 1 1234567900 -> 8.10000001E-10 Inexact Rounded", c9hu); TDiv("divx417 divide 1 1234567901 -> 8.10000000E-10 Inexact Rounded", c9hu); TDiv("divx418 divide 1 1234567902 -> 8.09999999E-10 Inexact Rounded", c9hu); //-- some longies TDiv("divx421 divide 1234567896.000000000000 1 -> 1.23456790E+9 Inexact Rounded", c9hu); TDiv("divx422 divide 1 1234567896.000000000000 -> 8.10000003E-10 Inexact Rounded", c9hu); TDiv("divx423 divide 1234567896.000000000001 1 -> 1.23456790E+9 Inexact Rounded", c9hu); TDiv("divx424 divide 1 1234567896.000000000001 -> 8.10000003E-10 Inexact Rounded", c9hu); TDiv("divx425 divide 1234567896.000000000000000000000000000000000000000009 1 -> 1.23456790E+9 Inexact Rounded", c9hu); TDiv("divx426 divide 1 1234567896.000000000000000000000000000000000000000009 -> 8.10000003E-10 Inexact Rounded", c9hu); TDiv("divx427 divide 1234567897.900010000000000000000000000000000000000009 1 -> 1.23456790E+9 Inexact Rounded", c9hu); TDiv("divx428 divide 1 1234567897.900010000000000000000000000000000000000009 -> 8.10000002E-10 Inexact Rounded", c9hu); //precision: 15 //-- still checking... BigDecimal.Context c15hu = new BigDecimal.Context(15, BigDecimal.RoundingMode.HalfUp); TDiv("divx441 divide 12345678000 1 -> 12345678000", c15hu); TDiv("divx442 divide 1 12345678000 -> 8.10000066420005E-11 Inexact Rounded", c15hu); TDiv("divx443 divide 1234567800 1 -> 1234567800", c15hu); TDiv("divx444 divide 1 1234567800 -> 8.10000066420005E-10 Inexact Rounded", c15hu); TDiv("divx445 divide 1234567890 1 -> 1234567890", c15hu); TDiv("divx446 divide 1 1234567890 -> 8.10000007371000E-10 Inexact Rounded", c15hu); TDiv("divx447 divide 1234567891 1 -> 1234567891", c15hu); TDiv("divx448 divide 1 1234567891 -> 8.10000006714900E-10 Inexact Rounded", c15hu); TDiv("divx449 divide 12345678901 1 -> 12345678901", c15hu); TDiv("divx450 divide 1 12345678901 -> 8.10000007305390E-11 Inexact Rounded", c15hu); TDiv("divx451 divide 1234567896 1 -> 1234567896", c15hu); TDiv("divx452 divide 1 1234567896 -> 8.10000003434400E-10 Inexact Rounded", c15hu); //-- high-lows TDiv("divx453 divide 1e+1 1 -> 1E+1", c15hu); TDiv("divx454 divide 1e+1 1.0 -> 1E+1", c15hu); TDiv("divx455 divide 1e+1 1.00 -> 1E+1", c15hu); TDiv("divx456 divide 1e+2 2 -> 5E+1", c15hu); TDiv("divx457 divide 1e+2 2.0 -> 5E+1", c15hu); TDiv("divx458 divide 1e+2 2.00 -> 5E+1", c15hu); //-- some from IEEE discussions TDiv("divx460 divide 3e0 2e0 -> 1.5", c15hu); TDiv("divx461 divide 30e-1 2e0 -> 1.5", c15hu); TDiv("divx462 divide 300e-2 2e0 -> 1.50", c15hu); TDiv("divx464 divide 3000e-3 2e0 -> 1.500", c15hu); TDiv("divx465 divide 3e0 20e-1 -> 1.5", c15hu); TDiv("divx466 divide 30e-1 20e-1 -> 1.5", c15hu); TDiv("divx467 divide 300e-2 20e-1 -> 1.5", c15hu); TDiv("divx468 divide 3000e-3 20e-1 -> 1.50", c15hu); TDiv("divx469 divide 3e0 200e-2 -> 1.5", c15hu); TDiv("divx470 divide 30e-1 200e-2 -> 1.5", c15hu); TDiv("divx471 divide 300e-2 200e-2 -> 1.5", c15hu); TDiv("divx472 divide 3000e-3 200e-2 -> 1.5", c15hu); TDiv("divx473 divide 3e0 2000e-3 -> 1.5", c15hu); TDiv("divx474 divide 30e-1 2000e-3 -> 1.5", c15hu); TDiv("divx475 divide 300e-2 2000e-3 -> 1.5", c15hu); TDiv("divx476 divide 3000e-3 2000e-3 -> 1.5", c15hu); //-- some reciprocals TDiv("divx480 divide 1 1.0E+33 -> 1E-33", c15hu); TDiv("divx481 divide 1 10E+33 -> 1E-34", c15hu); TDiv("divx482 divide 1 1.0E-33 -> 1E+33", c15hu); TDiv("divx483 divide 1 10E-33 -> 1E+32", c15hu); //-- RMS discussion table //maxexponent: 96 //minexponent: -95 //precision: 7 TDiv("divx484 divide 0e5 1e3 -> 0E+2", c7hu); TDiv("divx485 divide 0e5 2e3 -> 0E+2", c7hu); TDiv("divx486 divide 0e5 10e2 -> 0E+3", c7hu); TDiv("divx487 divide 0e5 20e2 -> 0E+3", c7hu); TDiv("divx488 divide 0e5 100e1 -> 0E+4", c7hu); TDiv("divx489 divide 0e5 200e1 -> 0E+4", c7hu); TDiv("divx491 divide 1e5 1e3 -> 1E+2", c7hu); TDiv("divx492 divide 1e5 2e3 -> 5E+1", c7hu); TDiv("divx493 divide 1e5 10e2 -> 1E+2", c7hu); TDiv("divx494 divide 1e5 20e2 -> 5E+1", c7hu); TDiv("divx495 divide 1e5 100e1 -> 1E+2", c7hu); TDiv("divx496 divide 1e5 200e1 -> 5E+1", c7hu); //-- tryzeros cases //precision: 7 //rounding: half_up //maxExponent: 92 //minexponent: -92 //TDiv("divx497 divide 0E+86 1000E-13 -> 0E+92 Clamped", c7hu); //TDiv("divx498 divide 0E-98 1000E+13 -> 0E-98 Clamped", c7hu); //precision: 9 //rounding: half_up //maxExponent: 999 //minexponent: -999 //-- focus on trailing zeros issues BigDecimal.Context c8hu = new BigDecimal.Context(8, BigDecimal.RoundingMode.HalfUp); //precision: 9 TDiv("divx500 divide 1 9.9 -> 0.101010101 Inexact Rounded", c9hu); //precision: 8 TDiv("divx501 divide 1 9.9 -> 0.10101010 Inexact Rounded", c8hu); //precision: 7 TDiv("divx502 divide 1 9.9 -> 0.1010101 Inexact Rounded", c7hu); //precision: 6 TDiv("divx503 divide 1 9.9 -> 0.101010 Inexact Rounded", c6hu); //precision: 9 TDiv("divx511 divide 1 2 -> 0.5", c9hu); TDiv("divx512 divide 1.0 2 -> 0.5", c9hu); TDiv("divx513 divide 1.00 2 -> 0.50", c9hu); TDiv("divx514 divide 1.000 2 -> 0.500", c9hu); TDiv("divx515 divide 1.0000 2 -> 0.5000", c9hu); TDiv("divx516 divide 1.00000 2 -> 0.50000", c9hu); TDiv("divx517 divide 1.000000 2 -> 0.500000", c9hu); TDiv("divx518 divide 1.0000000 2 -> 0.5000000", c9hu); TDiv("divx519 divide 1.00 2.00 -> 0.5", c9hu); TDiv("divx521 divide 2 1 -> 2", c9hu); TDiv("divx522 divide 2 1.0 -> 2", c9hu); TDiv("divx523 divide 2 1.00 -> 2", c9hu); TDiv("divx524 divide 2 1.000 -> 2", c9hu); TDiv("divx525 divide 2 1.0000 -> 2", c9hu); TDiv("divx526 divide 2 1.00000 -> 2", c9hu); TDiv("divx527 divide 2 1.000000 -> 2", c9hu); TDiv("divx528 divide 2 1.0000000 -> 2", c9hu); TDiv("divx529 divide 2.00 1.00 -> 2", c9hu); TDiv("divx530 divide 2.40 2 -> 1.20", c9hu); TDiv("divx531 divide 2.40 4 -> 0.60", c9hu); TDiv("divx532 divide 2.40 10 -> 0.24", c9hu); TDiv("divx533 divide 2.40 2.0 -> 1.2", c9hu); TDiv("divx534 divide 2.40 4.0 -> 0.6", c9hu); TDiv("divx535 divide 2.40 10.0 -> 0.24", c9hu); TDiv("divx536 divide 2.40 2.00 -> 1.2", c9hu); TDiv("divx537 divide 2.40 4.00 -> 0.6", c9hu); TDiv("divx538 divide 2.40 10.00 -> 0.24", c9hu); TDiv("divx539 divide 0.9 0.1 -> 9", c9hu); TDiv("divx540 divide 0.9 0.01 -> 9E+1", c9hu); TDiv("divx541 divide 0.9 0.001 -> 9E+2", c9hu); TDiv("divx542 divide 5 2 -> 2.5", c9hu); TDiv("divx543 divide 5 2.0 -> 2.5", c9hu); TDiv("divx544 divide 5 2.00 -> 2.5", c9hu); TDiv("divx545 divide 5 20 -> 0.25", c9hu); TDiv("divx546 divide 5 20.0 -> 0.25", c9hu); TDiv("divx547 divide 2.400 2 -> 1.200", c9hu); TDiv("divx548 divide 2.400 2.0 -> 1.20", c9hu); TDiv("divx549 divide 2.400 2.400 -> 1", c9hu); TDiv("divx550 divide 240 1 -> 240", c9hu); TDiv("divx551 divide 240 10 -> 24", c9hu); TDiv("divx552 divide 240 100 -> 2.4", c9hu); TDiv("divx553 divide 240 1000 -> 0.24", c9hu); TDiv("divx554 divide 2400 1 -> 2400", c9hu); TDiv("divx555 divide 2400 10 -> 240", c9hu); TDiv("divx556 divide 2400 100 -> 24", c9hu); TDiv("divx557 divide 2400 1000 -> 2.4", c9hu); //-- +ve exponent //precision: 5 BigDecimal.Context c5hu = new BigDecimal.Context(5, BigDecimal.RoundingMode.HalfUp); TDiv("divx570 divide 2.4E+6 2 -> 1.2E+6", c5hu); TDiv("divx571 divide 2.40E+6 2 -> 1.20E+6", c5hu); TDiv("divx572 divide 2.400E+6 2 -> 1.200E+6", c5hu); TDiv("divx573 divide 2.4000E+6 2 -> 1.2000E+6", c5hu); TDiv("divx574 divide 24E+5 2 -> 1.2E+6", c5hu); TDiv("divx575 divide 240E+4 2 -> 1.20E+6", c5hu); TDiv("divx576 divide 2400E+3 2 -> 1.200E+6", c5hu); TDiv("divx577 divide 24000E+2 2 -> 1.2000E+6", c5hu); //precision: 6 TDiv("divx580 divide 2.4E+6 2 -> 1.2E+6", c6hu); TDiv("divx581 divide 2.40E+6 2 -> 1.20E+6", c6hu); TDiv("divx582 divide 2.400E+6 2 -> 1.200E+6", c6hu); TDiv("divx583 divide 2.4000E+6 2 -> 1.2000E+6", c6hu); TDiv("divx584 divide 24E+5 2 -> 1.2E+6", c6hu); TDiv("divx585 divide 240E+4 2 -> 1.20E+6", c6hu); TDiv("divx586 divide 2400E+3 2 -> 1.200E+6", c6hu); TDiv("divx587 divide 24000E+2 2 -> 1.2000E+6", c6hu); //precision: 7 TDiv("divx590 divide 2.4E+6 2 -> 1.2E+6", c7hu); TDiv("divx591 divide 2.40E+6 2 -> 1.20E+6", c7hu); TDiv("divx592 divide 2.400E+6 2 -> 1.200E+6", c7hu); TDiv("divx593 divide 2.4000E+6 2 -> 1.2000E+6", c7hu); TDiv("divx594 divide 24E+5 2 -> 1.2E+6", c7hu); TDiv("divx595 divide 240E+4 2 -> 1.20E+6", c7hu); TDiv("divx596 divide 2400E+3 2 -> 1.200E+6", c7hu); TDiv("divx597 divide 24000E+2 2 -> 1.2000E+6", c7hu); //precision: 9 TDiv("divx600 divide 2.4E+9 2 -> 1.2E+9", c9hu); TDiv("divx601 divide 2.40E+9 2 -> 1.20E+9", c9hu); TDiv("divx602 divide 2.400E+9 2 -> 1.200E+9", c9hu); TDiv("divx603 divide 2.4000E+9 2 -> 1.2000E+9", c9hu); TDiv("divx604 divide 24E+8 2 -> 1.2E+9", c9hu); TDiv("divx605 divide 240E+7 2 -> 1.20E+9", c9hu); TDiv("divx606 divide 2400E+6 2 -> 1.200E+9", c9hu); TDiv("divx607 divide 24000E+5 2 -> 1.2000E+9", c9hu); //-- long operand triangle //precision: 33 TDiv("divx610 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.8131097703792 Inexact Rounded", new BigDecimal.Context(33, BigDecimal.RoundingMode.HalfUp)); //precision: 32 TDiv("divx611 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.813109770379 Inexact Rounded", new BigDecimal.Context(32, BigDecimal.RoundingMode.HalfUp)); //precision: 31 TDiv("divx612 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.81310977038 Inexact Rounded", new BigDecimal.Context(31, BigDecimal.RoundingMode.HalfUp)); //precision: 30 TDiv("divx613 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.8131097704 Inexact Rounded", new BigDecimal.Context(30, BigDecimal.RoundingMode.HalfUp)); //precision: 29 TDiv("divx614 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.813109770 Inexact Rounded", new BigDecimal.Context(29, BigDecimal.RoundingMode.HalfUp)); //precision: 28 TDiv("divx615 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.81310977 Inexact Rounded", new BigDecimal.Context(28, BigDecimal.RoundingMode.HalfUp)); //precision: 27 TDiv("divx616 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.8131098 Inexact Rounded", new BigDecimal.Context(27, BigDecimal.RoundingMode.HalfUp)); //precision: 26 TDiv("divx617 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.813110 Inexact Rounded", new BigDecimal.Context(26, BigDecimal.RoundingMode.HalfUp)); //precision: 25 TDiv("divx618 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.81311 Inexact Rounded", new BigDecimal.Context(25, BigDecimal.RoundingMode.HalfUp)); //precision: 24 TDiv("divx619 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.8131 Inexact Rounded", new BigDecimal.Context(24, BigDecimal.RoundingMode.HalfUp)); //precision: 23 TDiv("divx620 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.813 Inexact Rounded", new BigDecimal.Context(23, BigDecimal.RoundingMode.HalfUp)); //precision: 22 TDiv("divx621 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.81 Inexact Rounded", new BigDecimal.Context(22, BigDecimal.RoundingMode.HalfUp)); //precision: 21 TDiv("divx622 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817797.8 Inexact Rounded", new BigDecimal.Context(21, BigDecimal.RoundingMode.HalfUp)); //precision: 20 TDiv("divx623 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -41011408883796817798 Inexact Rounded", new BigDecimal.Context(20, BigDecimal.RoundingMode.HalfUp)); //precision: 19 TDiv("divx624 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.101140888379681780E+19 Inexact Rounded", new BigDecimal.Context(19, BigDecimal.RoundingMode.HalfUp)); //precision: 18 TDiv("divx625 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.10114088837968178E+19 Inexact Rounded", new BigDecimal.Context(18, BigDecimal.RoundingMode.HalfUp)); //precision: 17 TDiv("divx626 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.1011408883796818E+19 Inexact Rounded", new BigDecimal.Context(17, BigDecimal.RoundingMode.HalfUp)); //precision: 16 TDiv("divx627 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.101140888379682E+19 Inexact Rounded", new BigDecimal.Context(16, BigDecimal.RoundingMode.HalfUp)); //precision: 15 TDiv("divx628 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.10114088837968E+19 Inexact Rounded", new BigDecimal.Context(15, BigDecimal.RoundingMode.HalfUp)); //precision: 14 TDiv("divx629 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.1011408883797E+19 Inexact Rounded", new BigDecimal.Context(14, BigDecimal.RoundingMode.HalfUp)); //precision: 13 TDiv("divx630 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.101140888380E+19 Inexact Rounded", new BigDecimal.Context(13, BigDecimal.RoundingMode.HalfUp)); //precision: 12 TDiv("divx631 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.10114088838E+19 Inexact Rounded", new BigDecimal.Context(12, BigDecimal.RoundingMode.HalfUp)); //precision: 11 TDiv("divx632 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.1011408884E+19 Inexact Rounded", new BigDecimal.Context(11, BigDecimal.RoundingMode.HalfUp)); //precision: 10 TDiv("divx633 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.101140888E+19 Inexact Rounded", new BigDecimal.Context(10, BigDecimal.RoundingMode.HalfUp)); //precision: 9 TDiv("divx634 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.10114089E+19 Inexact Rounded", new BigDecimal.Context(9, BigDecimal.RoundingMode.HalfUp)); //precision: 8 TDiv("divx635 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.1011409E+19 Inexact Rounded", new BigDecimal.Context(8, BigDecimal.RoundingMode.HalfUp)); //precision: 7 TDiv("divx636 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.101141E+19 Inexact Rounded", new BigDecimal.Context(7, BigDecimal.RoundingMode.HalfUp)); //precision: 6 TDiv("divx637 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.10114E+19 Inexact Rounded", new BigDecimal.Context(6, BigDecimal.RoundingMode.HalfUp)); //precision: 5 TDiv("divx638 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.1011E+19 Inexact Rounded", new BigDecimal.Context(5, BigDecimal.RoundingMode.HalfUp)); //precision: 4 TDiv("divx639 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.101E+19 Inexact Rounded", new BigDecimal.Context(4, BigDecimal.RoundingMode.HalfUp)); //precision: 3 TDiv("divx640 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.10E+19 Inexact Rounded", new BigDecimal.Context(3, BigDecimal.RoundingMode.HalfUp)); //precision: 2 TDiv("divx641 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4.1E+19 Inexact Rounded", new BigDecimal.Context(2, BigDecimal.RoundingMode.HalfUp)); //precision: 1 TDiv("divx642 divide -3374988581607586061255542201048 82293895124.90045271504836568681 -> -4E+19 Inexact Rounded", new BigDecimal.Context(1, BigDecimal.RoundingMode.HalfUp)); //-- more zeros, etc. //precision: 16 //rounding: half_up //maxExponent: 384 //minExponent: -383 BigDecimal.Context c16hu = new BigDecimal.Context(16, BigDecimal.RoundingMode.HalfUp); TDiv("divx731 divide 5.00 1E-3 -> 5.00E+3", c16hu); TDiv("divx741 divide 0 -1 -> 0", c16hu); // mod: neg zero TDiv("divx742 divide -0 -1 -> 0", c16hu); TDiv("divx743 divide 0 1 -> 0", c16hu); TDiv("divx744 divide -0 1 -> 0", c16hu); // mod: neg zero TDiv("divx751 divide 0.0 -1 -> 0.0", c16hu); // mod: neg zero TDiv("divx752 divide -0.0 -1 -> 0.0", c16hu); TDiv("divx753 divide 0.0 1 -> 0.0", c16hu); TDiv("divx754 divide -0.0 1 -> 0.0", c16hu); // mod: neg zero TDiv("divx761 divide 0 -1.0 -> 0E+1", c16hu); // mod: neg zero TDiv("divx762 divide -0 -1.0 -> 0E+1", c16hu); TDiv("divx763 divide 0 1.0 -> 0E+1", c16hu); TDiv("divx764 divide -0 1.0 -> 0E+1", c16hu); // mod: neg zero TDiv("divx771 divide 0.0 -1.0 -> 0", c16hu); // mod: neg zero TDiv("divx772 divide -0.0 -1.0 -> 0", c16hu); TDiv("divx773 divide 0.0 1.0 -> 0", c16hu); TDiv("divx774 divide -0.0 1.0 -> 0", c16hu); // mod: neg zero //precision: 34 //rounding: half_up //maxExponent: 6144 //minExponent: -6143 //-- Examples from SQL proposal (Krishna Kulkarni) //precision: 7 TDiv("divx1021 divide 1E0 1E0 -> 1", c7hu); TDiv("divx1022 divide 1E0 2E0 -> 0.5", c7hu); TDiv("divx1023 divide 1E0 3E0 -> 0.3333333 Inexact Rounded", c7hu); TDiv("divx1024 divide 100E-2 1000E-3 -> 1", c7hu); TDiv("divx1025 divide 24E-1 2E0 -> 1.2", c7hu); TDiv("divx1026 divide 2400E-3 2E0 -> 1.200", c7hu); TDiv("divx1027 divide 5E0 2E0 -> 2.5", c7hu); TDiv("divx1028 divide 5E0 20E-1 -> 2.5", c7hu); TDiv("divx1029 divide 5E0 2000E-3 -> 2.5", c7hu); TDiv("divx1030 divide 5E0 2E-1 -> 25", c7hu); TDiv("divx1031 divide 5E0 20E-2 -> 25", c7hu); TDiv("divx1032 divide 480E-2 3E0 -> 1.60", c7hu); TDiv("divx1033 divide 47E-1 2E0 -> 2.35", c7hu); //-- ECMAScript bad examples BigDecimal.Context c7hd = new BigDecimal.Context(7, BigDecimal.RoundingMode.HalfDown); BigDecimal.Context c7he = new BigDecimal.Context(7, BigDecimal.RoundingMode.HalfEven); //rounding: half_down //precision: 7 TDiv("divx1050 divide 5 9 -> 0.5555556 Inexact Rounded", c7hd); //rounding: half_even TDiv("divx1051 divide 5 11 -> 0.4545455 Inexact Rounded", c7he); }
public void SpecTestSub() { BigDecimal.Context c9hu = new BigDecimal.Context(9, BigDecimal.RoundingMode.HalfUp); //version: 2.59 // //extended: 1 //precision: 9 //rounding: half_up //maxExponent: 384 //minexponent: -383 // //-- [first group are 'quick confidence check'] TSub("subx001 subtract 0 0 -> '0'", c9hu); TSub("subx002 subtract 1 1 -> '0'", c9hu); TSub("subx003 subtract 1 2 -> '-1'", c9hu); TSub("subx004 subtract 2 1 -> '1'", c9hu); TSub("subx005 subtract 2 2 -> '0'", c9hu); TSub("subx006 subtract 3 2 -> '1'", c9hu); TSub("subx007 subtract 2 3 -> '-1'", c9hu); TSub("subx011 subtract -0 0 -> '0'", c9hu); // mod: neg zero TSub("subx012 subtract -1 1 -> '-2'", c9hu); TSub("subx013 subtract -1 2 -> '-3'", c9hu); TSub("subx014 subtract -2 1 -> '-3'", c9hu); TSub("subx015 subtract -2 2 -> '-4'", c9hu); TSub("subx016 subtract -3 2 -> '-5'", c9hu); TSub("subx017 subtract -2 3 -> '-5'", c9hu); TSub("subx021 subtract 0 -0 -> '0'", c9hu); TSub("subx022 subtract 1 -1 -> '2'", c9hu); TSub("subx023 subtract 1 -2 -> '3'", c9hu); TSub("subx024 subtract 2 -1 -> '3'", c9hu); TSub("subx025 subtract 2 -2 -> '4'", c9hu); TSub("subx026 subtract 3 -2 -> '5'", c9hu); TSub("subx027 subtract 2 -3 -> '5'", c9hu); TSub("subx030 subtract 11 1 -> 10", c9hu); TSub("subx031 subtract 10 1 -> 9", c9hu); TSub("subx032 subtract 9 1 -> 8", c9hu); TSub("subx033 subtract 1 1 -> 0", c9hu); TSub("subx034 subtract 0 1 -> -1", c9hu); TSub("subx035 subtract -1 1 -> -2", c9hu); TSub("subx036 subtract -9 1 -> -10", c9hu); TSub("subx037 subtract -10 1 -> -11", c9hu); TSub("subx038 subtract -11 1 -> -12", c9hu); TSub("subx040 subtract '5.75' '3.3' -> '2.45'", c9hu); TSub("subx041 subtract '5' '-3' -> '8'", c9hu); TSub("subx042 subtract '-5' '-3' -> '-2'", c9hu); TSub("subx043 subtract '-7' '2.5' -> '-9.5'", c9hu); TSub("subx044 subtract '0.7' '0.3' -> '0.4'", c9hu); TSub("subx045 subtract '1.3' '0.3' -> '1.0'", c9hu); TSub("subx046 subtract '1.25' '1.25' -> '0.00'", c9hu); TSub("subx050 subtract '1.23456789' '1.00000000' -> '0.23456789'", c9hu); TSub("subx051 subtract '1.23456789' '1.00000089' -> '0.23456700'", c9hu); TSub("subx052 subtract '0.5555555559' '0.0000000001' -> '0.555555556' Inexact Rounded", c9hu); TSub("subx053 subtract '0.5555555559' '0.0000000005' -> '0.555555555' Inexact Rounded", c9hu); TSub("subx054 subtract '0.4444444444' '0.1111111111' -> '0.333333333' Inexact Rounded", c9hu); TSub("subx055 subtract '1.0000000000' '0.00000001' -> '0.999999990' Rounded", c9hu); TSub("subx056 subtract '0.4444444444999' '0' -> '0.444444444' Inexact Rounded", c9hu); TSub("subx057 subtract '0.4444444445000' '0' -> '0.444444445' Inexact Rounded", c9hu); TSub("subx060 subtract '70' '10000e+9' -> '-1.00000000E+13' Inexact Rounded", c9hu); TSub("subx061 subtract '700' '10000e+9' -> '-1.00000000E+13' Inexact Rounded", c9hu); TSub("subx062 subtract '7000' '10000e+9' -> '-9.99999999E+12' Inexact Rounded", c9hu); TSub("subx063 subtract '70000' '10000e+9' -> '-9.99999993E+12' Rounded", c9hu); TSub("subx064 subtract '700000' '10000e+9' -> '-9.99999930E+12' Rounded", c9hu); // -- symmetry: TSub("subx065 subtract '10000e+9' '70' -> '1.00000000E+13' Inexact Rounded", c9hu); TSub("subx066 subtract '10000e+9' '700' -> '1.00000000E+13' Inexact Rounded", c9hu); TSub("subx067 subtract '10000e+9' '7000' -> '9.99999999E+12' Inexact Rounded", c9hu); TSub("subx068 subtract '10000e+9' '70000' -> '9.99999993E+12' Rounded", c9hu); TSub("subx069 subtract '10000e+9' '700000' -> '9.99999930E+12' Rounded", c9hu); // -- change precision TSub("subx080 subtract '10000e+9' '70000' -> '9.99999993E+12' Rounded", c9hu); //precision: 6 BigDecimal.Context c6hu = new BigDecimal.Context(6, BigDecimal.RoundingMode.HalfUp); TSub("subx081 subtract '10000e+9' '70000' -> '1.00000E+13' Inexact Rounded", c6hu); //precision: 9 // -- some of the next group are really constructor tests TSub("subx090 subtract '00.0' '0.0' -> '0.0'", c9hu); TSub("subx091 subtract '00.0' '0.00' -> '0.00'", c9hu); TSub("subx092 subtract '0.00' '00.0' -> '0.00'", c9hu); TSub("subx093 subtract '00.0' '0.00' -> '0.00'", c9hu); TSub("subx094 subtract '0.00' '00.0' -> '0.00'", c9hu); TSub("subx095 subtract '3' '.3' -> '2.7'", c9hu); TSub("subx096 subtract '3.' '.3' -> '2.7'", c9hu); TSub("subx097 subtract '3.0' '.3' -> '2.7'", c9hu); TSub("subx098 subtract '3.00' '.3' -> '2.70'", c9hu); TSub("subx099 subtract '3' '3' -> '0'", c9hu); TSub("subx100 subtract '3' '+3' -> '0'", c9hu); TSub("subx101 subtract '3' '-3' -> '6'", c9hu); TSub("subx102 subtract '3' '0.3' -> '2.7'", c9hu); TSub("subx103 subtract '3.' '0.3' -> '2.7'", c9hu); TSub("subx104 subtract '3.0' '0.3' -> '2.7'", c9hu); TSub("subx105 subtract '3.00' '0.3' -> '2.70'", c9hu); TSub("subx106 subtract '3' '3.0' -> '0.0'", c9hu); TSub("subx107 subtract '3' '+3.0' -> '0.0'", c9hu); TSub("subx108 subtract '3' '-3.0' -> '6.0'", c9hu); //-- the above all from add; massaged and extended. Now some new ones... //-- [particularly important for comparisons] //-- NB: -xE-8 below were non-exponents pre-ANSI X3-274, and -1E-7 or 0E-7 //-- with input rounding. TSub("subx120 subtract '10.23456784' '10.23456789' -> '-5E-8'", c9hu); TSub("subx121 subtract '10.23456785' '10.23456789' -> '-4E-8'", c9hu); TSub("subx122 subtract '10.23456786' '10.23456789' -> '-3E-8'", c9hu); TSub("subx123 subtract '10.23456787' '10.23456789' -> '-2E-8'", c9hu); TSub("subx124 subtract '10.23456788' '10.23456789' -> '-1E-8'", c9hu); TSub("subx125 subtract '10.23456789' '10.23456789' -> '0E-8'", c9hu); TSub("subx126 subtract '10.23456790' '10.23456789' -> '1E-8'", c9hu); TSub("subx127 subtract '10.23456791' '10.23456789' -> '2E-8'", c9hu); TSub("subx128 subtract '10.23456792' '10.23456789' -> '3E-8'", c9hu); TSub("subx129 subtract '10.23456793' '10.23456789' -> '4E-8'", c9hu); TSub("subx130 subtract '10.23456794' '10.23456789' -> '5E-8'", c9hu); TSub("subx131 subtract '10.23456781' '10.23456786' -> '-5E-8'", c9hu); TSub("subx132 subtract '10.23456782' '10.23456786' -> '-4E-8'", c9hu); TSub("subx133 subtract '10.23456783' '10.23456786' -> '-3E-8'", c9hu); TSub("subx134 subtract '10.23456784' '10.23456786' -> '-2E-8'", c9hu); TSub("subx135 subtract '10.23456785' '10.23456786' -> '-1E-8'", c9hu); TSub("subx136 subtract '10.23456786' '10.23456786' -> '0E-8'", c9hu); TSub("subx137 subtract '10.23456787' '10.23456786' -> '1E-8'", c9hu); TSub("subx138 subtract '10.23456788' '10.23456786' -> '2E-8'", c9hu); TSub("subx139 subtract '10.23456789' '10.23456786' -> '3E-8'", c9hu); TSub("subx140 subtract '10.23456790' '10.23456786' -> '4E-8'", c9hu); TSub("subx141 subtract '10.23456791' '10.23456786' -> '5E-8'", c9hu); TSub("subx142 subtract '1' '0.999999999' -> '1E-9'", c9hu); TSub("subx143 subtract '0.999999999' '1' -> '-1E-9'", c9hu); TSub("subx144 subtract '-10.23456780' '-10.23456786' -> '6E-8'", c9hu); TSub("subx145 subtract '-10.23456790' '-10.23456786' -> '-4E-8'", c9hu); TSub("subx146 subtract '-10.23456791' '-10.23456786' -> '-5E-8'", c9hu); BigDecimal.Context c3hu = new BigDecimal.Context(3, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c12hu = new BigDecimal.Context(12, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c15hu = new BigDecimal.Context(15, BigDecimal.RoundingMode.HalfUp); //precision: 3 TSub("subx150 subtract '12345678900000' '9999999999999' -> 2.35E+12 Inexact Rounded", c3hu); TSub("subx151 subtract '9999999999999' '12345678900000' -> -2.35E+12 Inexact Rounded", c3hu); //precision: 6 TSub("subx152 subtract '12345678900000' '9999999999999' -> 2.34568E+12 Inexact Rounded", c6hu); TSub("subx153 subtract '9999999999999' '12345678900000' -> -2.34568E+12 Inexact Rounded", c6hu); //precision: 9 TSub("subx154 subtract '12345678900000' '9999999999999' -> 2.34567890E+12 Inexact Rounded", c9hu); TSub("subx155 subtract '9999999999999' '12345678900000' -> -2.34567890E+12 Inexact Rounded", c9hu); //precision: 12 TSub("subx156 subtract '12345678900000' '9999999999999' -> 2.34567890000E+12 Inexact Rounded", c12hu); TSub("subx157 subtract '9999999999999' '12345678900000' -> -2.34567890000E+12 Inexact Rounded", c12hu); //precision: 15 TSub("subx158 subtract '12345678900000' '9999999999999' -> 2345678900001", c15hu); TSub("subx159 subtract '9999999999999' '12345678900000' -> -2345678900001", c15hu); //precision: 9 //-- additional scaled arithmetic tests [0.97 problem] TSub("subx160 subtract '0' '.1' -> '-0.1'", c9hu); TSub("subx161 subtract '00' '.97983' -> '-0.97983'", c9hu); TSub("subx162 subtract '0' '.9' -> '-0.9'", c9hu); TSub("subx163 subtract '0' '0.102' -> '-0.102'", c9hu); TSub("subx164 subtract '0' '.4' -> '-0.4'", c9hu); TSub("subx165 subtract '0' '.307' -> '-0.307'", c9hu); TSub("subx166 subtract '0' '.43822' -> '-0.43822'", c9hu); TSub("subx167 subtract '0' '.911' -> '-0.911'", c9hu); TSub("subx168 subtract '.0' '.02' -> '-0.02'", c9hu); TSub("subx169 subtract '00' '.392' -> '-0.392'", c9hu); TSub("subx170 subtract '0' '.26' -> '-0.26'", c9hu); TSub("subx171 subtract '0' '0.51' -> '-0.51'", c9hu); TSub("subx172 subtract '0' '.2234' -> '-0.2234'", c9hu); TSub("subx173 subtract '0' '.2' -> '-0.2'", c9hu); TSub("subx174 subtract '.0' '.0008' -> '-0.0008'", c9hu); //-- 0. on left TSub("subx180 subtract '0.0' '-.1' -> '0.1'", c9hu); TSub("subx181 subtract '0.00' '-.97983' -> '0.97983'", c9hu); TSub("subx182 subtract '0.0' '-.9' -> '0.9'", c9hu); TSub("subx183 subtract '0.0' '-0.102' -> '0.102'", c9hu); TSub("subx184 subtract '0.0' '-.4' -> '0.4'", c9hu); TSub("subx185 subtract '0.0' '-.307' -> '0.307'", c9hu); TSub("subx186 subtract '0.0' '-.43822' -> '0.43822'", c9hu); TSub("subx187 subtract '0.0' '-.911' -> '0.911'", c9hu); TSub("subx188 subtract '0.0' '-.02' -> '0.02'", c9hu); TSub("subx189 subtract '0.00' '-.392' -> '0.392'", c9hu); TSub("subx190 subtract '0.0' '-.26' -> '0.26'", c9hu); TSub("subx191 subtract '0.0' '-0.51' -> '0.51'", c9hu); TSub("subx192 subtract '0.0' '-.2234' -> '0.2234'", c9hu); TSub("subx193 subtract '0.0' '-.2' -> '0.2'", c9hu); TSub("subx194 subtract '0.0' '-.0008' -> '0.0008'", c9hu); //-- negatives of same TSub("subx200 subtract '0' '-.1' -> '0.1'", c9hu); TSub("subx201 subtract '00' '-.97983' -> '0.97983'", c9hu); TSub("subx202 subtract '0' '-.9' -> '0.9'", c9hu); TSub("subx203 subtract '0' '-0.102' -> '0.102'", c9hu); TSub("subx204 subtract '0' '-.4' -> '0.4'", c9hu); TSub("subx205 subtract '0' '-.307' -> '0.307'", c9hu); TSub("subx206 subtract '0' '-.43822' -> '0.43822'", c9hu); TSub("subx207 subtract '0' '-.911' -> '0.911'", c9hu); TSub("subx208 subtract '.0' '-.02' -> '0.02'", c9hu); TSub("subx209 subtract '00' '-.392' -> '0.392'", c9hu); TSub("subx210 subtract '0' '-.26' -> '0.26'", c9hu); TSub("subx211 subtract '0' '-0.51' -> '0.51'", c9hu); TSub("subx212 subtract '0' '-.2234' -> '0.2234'", c9hu); TSub("subx213 subtract '0' '-.2' -> '0.2'", c9hu); TSub("subx214 subtract '.0' '-.0008' -> '0.0008'", c9hu); //-- more fixed, LHS swaps [really the same as testcases under add] TSub("subx220 subtract '-56267E-12' 0 -> '-5.6267E-8'", c9hu); TSub("subx221 subtract '-56267E-11' 0 -> '-5.6267E-7'", c9hu); TSub("subx222 subtract '-56267E-10' 0 -> '-0.0000056267'", c9hu); TSub("subx223 subtract '-56267E-9' 0 -> '-0.000056267'", c9hu); TSub("subx224 subtract '-56267E-8' 0 -> '-0.00056267'", c9hu); TSub("subx225 subtract '-56267E-7' 0 -> '-0.0056267'", c9hu); TSub("subx226 subtract '-56267E-6' 0 -> '-0.056267'", c9hu); TSub("subx227 subtract '-56267E-5' 0 -> '-0.56267'", c9hu); TSub("subx228 subtract '-56267E-2' 0 -> '-562.67'", c9hu); TSub("subx229 subtract '-56267E-1' 0 -> '-5626.7'", c9hu); TSub("subx230 subtract '-56267E-0' 0 -> '-56267'", c9hu); //-- symmetry ... TSub("subx240 subtract 0 '-56267E-12' -> '5.6267E-8'", c9hu); TSub("subx241 subtract 0 '-56267E-11' -> '5.6267E-7'", c9hu); TSub("subx242 subtract 0 '-56267E-10' -> '0.0000056267'", c9hu); TSub("subx243 subtract 0 '-56267E-9' -> '0.000056267'", c9hu); TSub("subx244 subtract 0 '-56267E-8' -> '0.00056267'", c9hu); TSub("subx245 subtract 0 '-56267E-7' -> '0.0056267'", c9hu); TSub("subx246 subtract 0 '-56267E-6' -> '0.056267'", c9hu); TSub("subx247 subtract 0 '-56267E-5' -> '0.56267'", c9hu); TSub("subx248 subtract 0 '-56267E-2' -> '562.67'", c9hu); TSub("subx249 subtract 0 '-56267E-1' -> '5626.7'", c9hu); TSub("subx250 subtract 0 '-56267E-0' -> '56267'", c9hu); //-- now some more from the 'new' add //precision: 9 TSub("subx301 subtract '1.23456789' '1.00000000' -> '0.23456789'", c9hu); TSub("subx302 subtract '1.23456789' '1.00000011' -> '0.23456778'", c9hu); TSub("subx311 subtract '0.4444444444' '0.5555555555' -> '-0.111111111' Inexact Rounded", c9hu); TSub("subx312 subtract '0.4444444440' '0.5555555555' -> '-0.111111112' Inexact Rounded", c9hu); TSub("subx313 subtract '0.4444444444' '0.5555555550' -> '-0.111111111' Inexact Rounded", c9hu); TSub("subx314 subtract '0.44444444449' '0' -> '0.444444444' Inexact Rounded", c9hu); TSub("subx315 subtract '0.444444444499' '0' -> '0.444444444' Inexact Rounded", c9hu); TSub("subx316 subtract '0.4444444444999' '0' -> '0.444444444' Inexact Rounded", c9hu); TSub("subx317 subtract '0.4444444445000' '0' -> '0.444444445' Inexact Rounded", c9hu); TSub("subx318 subtract '0.4444444445001' '0' -> '0.444444445' Inexact Rounded", c9hu); TSub("subx319 subtract '0.444444444501' '0' -> '0.444444445' Inexact Rounded", c9hu); TSub("subx320 subtract '0.44444444451' '0' -> '0.444444445' Inexact Rounded", c9hu); //-- some carrying effects TSub("subx321 subtract '0.9998' '0.0000' -> '0.9998'", c9hu); TSub("subx322 subtract '0.9998' '0.0001' -> '0.9997'", c9hu); TSub("subx323 subtract '0.9998' '0.0002' -> '0.9996'", c9hu); TSub("subx324 subtract '0.9998' '0.0003' -> '0.9995'", c9hu); TSub("subx325 subtract '0.9998' '-0.0000' -> '0.9998'", c9hu); TSub("subx326 subtract '0.9998' '-0.0001' -> '0.9999'", c9hu); TSub("subx327 subtract '0.9998' '-0.0002' -> '1.0000'", c9hu); TSub("subx328 subtract '0.9998' '-0.0003' -> '1.0001'", c9hu); TSub("subx330 subtract '70' '10000e+9' -> '-1.00000000E+13' Inexact Rounded", c9hu); TSub("subx331 subtract '700' '10000e+9' -> '-1.00000000E+13' Inexact Rounded", c9hu); TSub("subx332 subtract '7000' '10000e+9' -> '-9.99999999E+12' Inexact Rounded", c9hu); TSub("subx333 subtract '70000' '10000e+9' -> '-9.99999993E+12' Rounded", c9hu); TSub("subx334 subtract '700000' '10000e+9' -> '-9.99999930E+12' Rounded", c9hu); TSub("subx335 subtract '7000000' '10000e+9' -> '-9.99999300E+12' Rounded", c9hu); //-- symmetry: TSub("subx340 subtract '10000e+9' '70' -> '1.00000000E+13' Inexact Rounded", c9hu); TSub("subx341 subtract '10000e+9' '700' -> '1.00000000E+13' Inexact Rounded", c9hu); TSub("subx342 subtract '10000e+9' '7000' -> '9.99999999E+12' Inexact Rounded", c9hu); TSub("subx343 subtract '10000e+9' '70000' -> '9.99999993E+12' Rounded", c9hu); TSub("subx344 subtract '10000e+9' '700000' -> '9.99999930E+12' Rounded", c9hu); TSub("subx345 subtract '10000e+9' '7000000' -> '9.99999300E+12' Rounded", c9hu); //-- same, higher precision //precision: 15 TSub("subx346 subtract '10000e+9' '7' -> '9999999999993'", c15hu); TSub("subx347 subtract '10000e+9' '70' -> '9999999999930'", c15hu); TSub("subx348 subtract '10000e+9' '700' -> '9999999999300'", c15hu); TSub("subx349 subtract '10000e+9' '7000' -> '9999999993000'", c15hu); TSub("subx350 subtract '10000e+9' '70000' -> '9999999930000'", c15hu); TSub("subx351 subtract '10000e+9' '700000' -> '9999999300000'", c15hu); TSub("subx352 subtract '7' '10000e+9' -> '-9999999999993'", c15hu); TSub("subx353 subtract '70' '10000e+9' -> '-9999999999930'", c15hu); TSub("subx354 subtract '700' '10000e+9' -> '-9999999999300'", c15hu); TSub("subx355 subtract '7000' '10000e+9' -> '-9999999993000'", c15hu); TSub("subx356 subtract '70000' '10000e+9' -> '-9999999930000'", c15hu); TSub("subx357 subtract '700000' '10000e+9' -> '-9999999300000'", c15hu); //-- zero preservation //precision: 6 TSub("subx360 subtract '10000e+9' '70000' -> '1.00000E+13' Inexact Rounded", c6hu); TSub("subx361 subtract 1 '0.0001' -> '0.9999'", c6hu); TSub("subx362 subtract 1 '0.00001' -> '0.99999'", c6hu); TSub("subx363 subtract 1 '0.000001' -> '0.999999'", c6hu); TSub("subx364 subtract 1 '0.0000001' -> '1.00000' Inexact Rounded", c6hu); TSub("subx365 subtract 1 '0.00000001' -> '1.00000' Inexact Rounded", c6hu); //-- some funny zeros [in case of bad signum] TSub("subx370 subtract 1 0 -> 1", c6hu); TSub("subx371 subtract 1 0. -> 1", c6hu); TSub("subx372 subtract 1 .0 -> 1.0", c6hu); TSub("subx373 subtract 1 0.0 -> 1.0", c6hu); TSub("subx374 subtract 0 1 -> -1", c6hu); TSub("subx375 subtract 0. 1 -> -1", c6hu); TSub("subx376 subtract .0 1 -> -1.0", c6hu); TSub("subx377 subtract 0.0 1 -> -1.0", c6hu); //precision: 9 //-- leading 0 digit before round TSub("subx910 subtract -103519362 -51897955.3 -> -51621406.7", c9hu); TSub("subx911 subtract 159579.444 89827.5229 -> 69751.9211", c9hu); TSub("subx920 subtract 333.123456 33.1234566 -> 299.999999 Inexact Rounded", c9hu); TSub("subx921 subtract 333.123456 33.1234565 -> 300.000000 Inexact Rounded", c9hu); TSub("subx922 subtract 133.123456 33.1234565 -> 99.9999995", c9hu); TSub("subx923 subtract 133.123456 33.1234564 -> 99.9999996", c9hu); TSub("subx924 subtract 133.123456 33.1234540 -> 100.000002 Rounded", c9hu); TSub("subx925 subtract 133.123456 43.1234560 -> 90.0000000", c9hu); TSub("subx926 subtract 133.123456 43.1234561 -> 89.9999999", c9hu); TSub("subx927 subtract 133.123456 43.1234566 -> 89.9999994", c9hu); TSub("subx928 subtract 101.123456 91.1234566 -> 9.9999994", c9hu); TSub("subx929 subtract 101.123456 99.1234566 -> 1.9999994", c9hu); //-- more of the same; probe for cluster boundary problems BigDecimal.Context c1hu = new BigDecimal.Context(1, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c2hu = new BigDecimal.Context(2, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c4hu = new BigDecimal.Context(4, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c5hu = new BigDecimal.Context(5, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c7hu = new BigDecimal.Context(7, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c8hu = new BigDecimal.Context(8, BigDecimal.RoundingMode.HalfUp); //precision: 1 TSub("subx930 subtract 11 2 -> 9", c1hu); //precision: 2 TSub("subx932 subtract 101 2 -> 99", c2hu); //precision: 3 TSub("subx934 subtract 101 2.1 -> 98.9", c3hu); TSub("subx935 subtract 101 92.01 -> 8.99", c3hu); //precision: 4 TSub("subx936 subtract 101 2.01 -> 98.99", c4hu); TSub("subx937 subtract 101 92.01 -> 8.99", c4hu); TSub("subx938 subtract 101 92.006 -> 8.994", c4hu); //precision: 5 TSub("subx939 subtract 101 2.001 -> 98.999", c5hu); TSub("subx940 subtract 101 92.001 -> 8.999", c5hu); TSub("subx941 subtract 101 92.0006 -> 8.9994", c5hu); //precision: 6 TSub("subx942 subtract 101 2.0001 -> 98.9999", c6hu); TSub("subx943 subtract 101 92.0001 -> 8.9999", c6hu); TSub("subx944 subtract 101 92.00006 -> 8.99994", c6hu); //precision: 7 TSub("subx945 subtract 101 2.00001 -> 98.99999", c7hu); TSub("subx946 subtract 101 92.00001 -> 8.99999", c7hu); TSub("subx947 subtract 101 92.000006 -> 8.999994", c7hu); //precision: 8 TSub("subx948 subtract 101 2.000001 -> 98.999999", c8hu); TSub("subx949 subtract 101 92.000001 -> 8.999999", c8hu); TSub("subx950 subtract 101 92.0000006 -> 8.9999994", c8hu); //precision: 9 TSub("subx951 subtract 101 2.0000001 -> 98.9999999", c9hu); TSub("subx952 subtract 101 92.0000001 -> 8.9999999", c9hu); TSub("subx953 subtract 101 92.00000006 -> 8.99999994", c9hu); //precision: 9 //-- more LHS swaps [were fixed] TSub("subx390 subtract '-56267E-10' 0 -> '-0.0000056267'", c9hu); TSub("subx391 subtract '-56267E-6' 0 -> '-0.056267'", c9hu); TSub("subx392 subtract '-56267E-5' 0 -> '-0.56267'", c9hu); TSub("subx393 subtract '-56267E-4' 0 -> '-5.6267'", c9hu); TSub("subx394 subtract '-56267E-3' 0 -> '-56.267'", c9hu); TSub("subx395 subtract '-56267E-2' 0 -> '-562.67'", c9hu); TSub("subx396 subtract '-56267E-1' 0 -> '-5626.7'", c9hu); TSub("subx397 subtract '-56267E-0' 0 -> '-56267'", c9hu); TSub("subx398 subtract '-5E-10' 0 -> '-5E-10'", c9hu); TSub("subx399 subtract '-5E-7' 0 -> '-5E-7'", c9hu); TSub("subx400 subtract '-5E-6' 0 -> '-0.000005'", c9hu); TSub("subx401 subtract '-5E-5' 0 -> '-0.00005'", c9hu); TSub("subx402 subtract '-5E-4' 0 -> '-0.0005'", c9hu); TSub("subx403 subtract '-5E-1' 0 -> '-0.5'", c9hu); TSub("subx404 subtract '-5E0' 0 -> '-5'", c9hu); TSub("subx405 subtract '-5E1' 0 -> '-50'", c9hu); TSub("subx406 subtract '-5E5' 0 -> '-500000'", c9hu); TSub("subx407 subtract '-5E8' 0 -> '-500000000'", c9hu); TSub("subx408 subtract '-5E9' 0 -> '-5.00000000E+9' Rounded", c9hu); TSub("subx409 subtract '-5E10' 0 -> '-5.00000000E+10' Rounded", c9hu); TSub("subx410 subtract '-5E11' 0 -> '-5.00000000E+11' Rounded", c9hu); TSub("subx411 subtract '-5E100' 0 -> '-5.00000000E+100' Rounded", c9hu); //-- more RHS swaps [were fixed] TSub("subx420 subtract 0 '-56267E-10' -> '0.0000056267'", c9hu); TSub("subx421 subtract 0 '-56267E-6' -> '0.056267'", c9hu); TSub("subx422 subtract 0 '-56267E-5' -> '0.56267'", c9hu); TSub("subx423 subtract 0 '-56267E-4' -> '5.6267'", c9hu); TSub("subx424 subtract 0 '-56267E-3' -> '56.267'", c9hu); TSub("subx425 subtract 0 '-56267E-2' -> '562.67'", c9hu); TSub("subx426 subtract 0 '-56267E-1' -> '5626.7'", c9hu); TSub("subx427 subtract 0 '-56267E-0' -> '56267'", c9hu); TSub("subx428 subtract 0 '-5E-10' -> '5E-10'", c9hu); TSub("subx429 subtract 0 '-5E-7' -> '5E-7'", c9hu); TSub("subx430 subtract 0 '-5E-6' -> '0.000005'", c9hu); TSub("subx431 subtract 0 '-5E-5' -> '0.00005'", c9hu); TSub("subx432 subtract 0 '-5E-4' -> '0.0005'", c9hu); TSub("subx433 subtract 0 '-5E-1' -> '0.5'", c9hu); TSub("subx434 subtract 0 '-5E0' -> '5'", c9hu); TSub("subx435 subtract 0 '-5E1' -> '50'", c9hu); TSub("subx436 subtract 0 '-5E5' -> '500000'", c9hu); TSub("subx437 subtract 0 '-5E8' -> '500000000'", c9hu); TSub("subx438 subtract 0 '-5E9' -> '5.00000000E+9' Rounded", c9hu); TSub("subx439 subtract 0 '-5E10' -> '5.00000000E+10' Rounded", c9hu); TSub("subx440 subtract 0 '-5E11' -> '5.00000000E+11' Rounded", c9hu); TSub("subx441 subtract 0 '-5E100' -> '5.00000000E+100' Rounded", c9hu); //-- try borderline precision, with carries, etc. //precision: 15 TSub("subx461 subtract '1E+12' '1' -> '999999999999'", c15hu); TSub("subx462 subtract '1E+12' '-1.11' -> '1000000000001.11'", c15hu); TSub("subx463 subtract '1.11' '-1E+12' -> '1000000000001.11'", c15hu); TSub("subx464 subtract '-1' '-1E+12' -> '999999999999'", c15hu); TSub("subx465 subtract '7E+12' '1' -> '6999999999999'", c15hu); TSub("subx466 subtract '7E+12' '-1.11' -> '7000000000001.11'", c15hu); TSub("subx467 subtract '1.11' '-7E+12' -> '7000000000001.11'", c15hu); TSub("subx468 subtract '-1' '-7E+12' -> '6999999999999'", c15hu); //-- 123456789012345 123456789012345 1 23456789012345 TSub("subx470 subtract '0.444444444444444' '-0.555555555555563' -> '1.00000000000001' Inexact Rounded", c15hu); TSub("subx471 subtract '0.444444444444444' '-0.555555555555562' -> '1.00000000000001' Inexact Rounded", c15hu); TSub("subx472 subtract '0.444444444444444' '-0.555555555555561' -> '1.00000000000001' Inexact Rounded", c15hu); TSub("subx473 subtract '0.444444444444444' '-0.555555555555560' -> '1.00000000000000' Inexact Rounded", c15hu); TSub("subx474 subtract '0.444444444444444' '-0.555555555555559' -> '1.00000000000000' Inexact Rounded", c15hu); TSub("subx475 subtract '0.444444444444444' '-0.555555555555558' -> '1.00000000000000' Inexact Rounded", c15hu); TSub("subx476 subtract '0.444444444444444' '-0.555555555555557' -> '1.00000000000000' Inexact Rounded", c15hu); TSub("subx477 subtract '0.444444444444444' '-0.555555555555556' -> '1.00000000000000' Rounded", c15hu); TSub("subx478 subtract '0.444444444444444' '-0.555555555555555' -> '0.999999999999999'", c15hu); TSub("subx479 subtract '0.444444444444444' '-0.555555555555554' -> '0.999999999999998'", c15hu); TSub("subx480 subtract '0.444444444444444' '-0.555555555555553' -> '0.999999999999997'", c15hu); TSub("subx481 subtract '0.444444444444444' '-0.555555555555552' -> '0.999999999999996'", c15hu); TSub("subx482 subtract '0.444444444444444' '-0.555555555555551' -> '0.999999999999995'", c15hu); TSub("subx483 subtract '0.444444444444444' '-0.555555555555550' -> '0.999999999999994'", c15hu); //-- and some more, including residue effects and different roundings //precision: 9 //rounding: half_up TSub("subx500 subtract '123456789' 0 -> '123456789'", c9hu); TSub("subx501 subtract '123456789' 0.000000001 -> '123456789' Inexact Rounded", c9hu); TSub("subx502 subtract '123456789' 0.000001 -> '123456789' Inexact Rounded", c9hu); TSub("subx503 subtract '123456789' 0.1 -> '123456789' Inexact Rounded", c9hu); TSub("subx504 subtract '123456789' 0.4 -> '123456789' Inexact Rounded", c9hu); TSub("subx505 subtract '123456789' 0.49 -> '123456789' Inexact Rounded", c9hu); TSub("subx506 subtract '123456789' 0.499999 -> '123456789' Inexact Rounded", c9hu); TSub("subx507 subtract '123456789' 0.499999999 -> '123456789' Inexact Rounded", c9hu); TSub("subx508 subtract '123456789' 0.5 -> '123456789' Inexact Rounded", c9hu); TSub("subx509 subtract '123456789' 0.500000001 -> '123456788' Inexact Rounded", c9hu); TSub("subx510 subtract '123456789' 0.500001 -> '123456788' Inexact Rounded", c9hu); TSub("subx511 subtract '123456789' 0.51 -> '123456788' Inexact Rounded", c9hu); TSub("subx512 subtract '123456789' 0.6 -> '123456788' Inexact Rounded", c9hu); TSub("subx513 subtract '123456789' 0.9 -> '123456788' Inexact Rounded", c9hu); TSub("subx514 subtract '123456789' 0.99999 -> '123456788' Inexact Rounded", c9hu); TSub("subx515 subtract '123456789' 0.999999999 -> '123456788' Inexact Rounded", c9hu); TSub("subx516 subtract '123456789' 1 -> '123456788'", c9hu); TSub("subx517 subtract '123456789' 1.000000001 -> '123456788' Inexact Rounded", c9hu); TSub("subx518 subtract '123456789' 1.00001 -> '123456788' Inexact Rounded", c9hu); TSub("subx519 subtract '123456789' 1.1 -> '123456788' Inexact Rounded", c9hu); //rounding: half_even BigDecimal.Context c9he = new BigDecimal.Context(9, BigDecimal.RoundingMode.HalfEven); TSub("subx520 subtract '123456789' 0 -> '123456789'", c9he); TSub("subx521 subtract '123456789' 0.000000001 -> '123456789' Inexact Rounded", c9he); TSub("subx522 subtract '123456789' 0.000001 -> '123456789' Inexact Rounded", c9he); TSub("subx523 subtract '123456789' 0.1 -> '123456789' Inexact Rounded", c9he); TSub("subx524 subtract '123456789' 0.4 -> '123456789' Inexact Rounded", c9he); TSub("subx525 subtract '123456789' 0.49 -> '123456789' Inexact Rounded", c9he); TSub("subx526 subtract '123456789' 0.499999 -> '123456789' Inexact Rounded", c9he); TSub("subx527 subtract '123456789' 0.499999999 -> '123456789' Inexact Rounded", c9he); TSub("subx528 subtract '123456789' 0.5 -> '123456788' Inexact Rounded", c9he); TSub("subx529 subtract '123456789' 0.500000001 -> '123456788' Inexact Rounded", c9he); TSub("subx530 subtract '123456789' 0.500001 -> '123456788' Inexact Rounded", c9he); TSub("subx531 subtract '123456789' 0.51 -> '123456788' Inexact Rounded", c9he); TSub("subx532 subtract '123456789' 0.6 -> '123456788' Inexact Rounded", c9he); TSub("subx533 subtract '123456789' 0.9 -> '123456788' Inexact Rounded", c9he); TSub("subx534 subtract '123456789' 0.99999 -> '123456788' Inexact Rounded", c9he); TSub("subx535 subtract '123456789' 0.999999999 -> '123456788' Inexact Rounded", c9he); TSub("subx536 subtract '123456789' 1 -> '123456788'", c9he); TSub("subx537 subtract '123456789' 1.00000001 -> '123456788' Inexact Rounded", c9he); TSub("subx538 subtract '123456789' 1.00001 -> '123456788' Inexact Rounded", c9he); TSub("subx539 subtract '123456789' 1.1 -> '123456788' Inexact Rounded", c9he); //-- critical few with even bottom digit... TSub("subx540 subtract '123456788' 0.499999999 -> '123456788' Inexact Rounded", c9he); TSub("subx541 subtract '123456788' 0.5 -> '123456788' Inexact Rounded", c9he); TSub("subx542 subtract '123456788' 0.500000001 -> '123456787' Inexact Rounded", c9he); //rounding: down BigDecimal.Context c9d = new BigDecimal.Context(9, BigDecimal.RoundingMode.Down); TSub("subx550 subtract '123456789' 0 -> '123456789'", c9d); TSub("subx551 subtract '123456789' 0.000000001 -> '123456788' Inexact Rounded", c9d); TSub("subx552 subtract '123456789' 0.000001 -> '123456788' Inexact Rounded", c9d); TSub("subx553 subtract '123456789' 0.1 -> '123456788' Inexact Rounded", c9d); TSub("subx554 subtract '123456789' 0.4 -> '123456788' Inexact Rounded", c9d); TSub("subx555 subtract '123456789' 0.49 -> '123456788' Inexact Rounded", c9d); TSub("subx556 subtract '123456789' 0.499999 -> '123456788' Inexact Rounded", c9d); TSub("subx557 subtract '123456789' 0.499999999 -> '123456788' Inexact Rounded", c9d); TSub("subx558 subtract '123456789' 0.5 -> '123456788' Inexact Rounded", c9d); TSub("subx559 subtract '123456789' 0.500000001 -> '123456788' Inexact Rounded", c9d); TSub("subx560 subtract '123456789' 0.500001 -> '123456788' Inexact Rounded", c9d); TSub("subx561 subtract '123456789' 0.51 -> '123456788' Inexact Rounded", c9d); TSub("subx562 subtract '123456789' 0.6 -> '123456788' Inexact Rounded", c9d); TSub("subx563 subtract '123456789' 0.9 -> '123456788' Inexact Rounded", c9d); TSub("subx564 subtract '123456789' 0.99999 -> '123456788' Inexact Rounded", c9d); TSub("subx565 subtract '123456789' 0.999999999 -> '123456788' Inexact Rounded", c9d); TSub("subx566 subtract '123456789' 1 -> '123456788'", c9d); TSub("subx567 subtract '123456789' 1.00000001 -> '123456787' Inexact Rounded", c9d); TSub("subx568 subtract '123456789' 1.00001 -> '123456787' Inexact Rounded", c9d); TSub("subx569 subtract '123456789' 1.1 -> '123456787' Inexact Rounded", c9d); //-- symmetry... //rounding: half_up TSub("subx600 subtract 0 '123456789' -> '-123456789'", c9hu); TSub("subx601 subtract 0.000000001 '123456789' -> '-123456789' Inexact Rounded", c9hu); TSub("subx602 subtract 0.000001 '123456789' -> '-123456789' Inexact Rounded", c9hu); TSub("subx603 subtract 0.1 '123456789' -> '-123456789' Inexact Rounded", c9hu); TSub("subx604 subtract 0.4 '123456789' -> '-123456789' Inexact Rounded", c9hu); TSub("subx605 subtract 0.49 '123456789' -> '-123456789' Inexact Rounded", c9hu); TSub("subx606 subtract 0.499999 '123456789' -> '-123456789' Inexact Rounded", c9hu); TSub("subx607 subtract 0.499999999 '123456789' -> '-123456789' Inexact Rounded", c9hu); TSub("subx608 subtract 0.5 '123456789' -> '-123456789' Inexact Rounded", c9hu); TSub("subx609 subtract 0.500000001 '123456789' -> '-123456788' Inexact Rounded", c9hu); TSub("subx610 subtract 0.500001 '123456789' -> '-123456788' Inexact Rounded", c9hu); TSub("subx611 subtract 0.51 '123456789' -> '-123456788' Inexact Rounded", c9hu); TSub("subx612 subtract 0.6 '123456789' -> '-123456788' Inexact Rounded", c9hu); TSub("subx613 subtract 0.9 '123456789' -> '-123456788' Inexact Rounded", c9hu); TSub("subx614 subtract 0.99999 '123456789' -> '-123456788' Inexact Rounded", c9hu); TSub("subx615 subtract 0.999999999 '123456789' -> '-123456788' Inexact Rounded", c9hu); TSub("subx616 subtract 1 '123456789' -> '-123456788'", c9hu); TSub("subx617 subtract 1.000000001 '123456789' -> '-123456788' Inexact Rounded", c9hu); TSub("subx618 subtract 1.00001 '123456789' -> '-123456788' Inexact Rounded", c9hu); TSub("subx619 subtract 1.1 '123456789' -> '-123456788' Inexact Rounded", c9hu); //rounding: half_even TSub("subx620 subtract 0 '123456789' -> '-123456789'", c9he); TSub("subx621 subtract 0.000000001 '123456789' -> '-123456789' Inexact Rounded", c9he); TSub("subx622 subtract 0.000001 '123456789' -> '-123456789' Inexact Rounded", c9he); TSub("subx623 subtract 0.1 '123456789' -> '-123456789' Inexact Rounded", c9he); TSub("subx624 subtract 0.4 '123456789' -> '-123456789' Inexact Rounded", c9he); TSub("subx625 subtract 0.49 '123456789' -> '-123456789' Inexact Rounded", c9he); TSub("subx626 subtract 0.499999 '123456789' -> '-123456789' Inexact Rounded", c9he); TSub("subx627 subtract 0.499999999 '123456789' -> '-123456789' Inexact Rounded", c9he); TSub("subx628 subtract 0.5 '123456789' -> '-123456788' Inexact Rounded", c9he); TSub("subx629 subtract 0.500000001 '123456789' -> '-123456788' Inexact Rounded", c9he); TSub("subx630 subtract 0.500001 '123456789' -> '-123456788' Inexact Rounded", c9he); TSub("subx631 subtract 0.51 '123456789' -> '-123456788' Inexact Rounded", c9he); TSub("subx632 subtract 0.6 '123456789' -> '-123456788' Inexact Rounded", c9he); TSub("subx633 subtract 0.9 '123456789' -> '-123456788' Inexact Rounded", c9he); TSub("subx634 subtract 0.99999 '123456789' -> '-123456788' Inexact Rounded", c9he); TSub("subx635 subtract 0.999999999 '123456789' -> '-123456788' Inexact Rounded", c9he); TSub("subx636 subtract 1 '123456789' -> '-123456788'", c9he); TSub("subx637 subtract 1.00000001 '123456789' -> '-123456788' Inexact Rounded", c9he); TSub("subx638 subtract 1.00001 '123456789' -> '-123456788' Inexact Rounded", c9he); TSub("subx639 subtract 1.1 '123456789' -> '-123456788' Inexact Rounded", c9he); //-- critical few with even bottom digit... TSub("subx640 subtract 0.499999999 '123456788' -> '-123456788' Inexact Rounded", c9he); TSub("subx641 subtract 0.5 '123456788' -> '-123456788' Inexact Rounded", c9he); TSub("subx642 subtract 0.500000001 '123456788' -> '-123456787' Inexact Rounded", c9he); //rounding: down TSub("subx650 subtract 0 '123456789' -> '-123456789'", c9d); TSub("subx651 subtract 0.000000001 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx652 subtract 0.000001 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx653 subtract 0.1 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx654 subtract 0.4 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx655 subtract 0.49 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx656 subtract 0.499999 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx657 subtract 0.499999999 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx658 subtract 0.5 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx659 subtract 0.500000001 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx660 subtract 0.500001 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx661 subtract 0.51 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx662 subtract 0.6 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx663 subtract 0.9 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx664 subtract 0.99999 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx665 subtract 0.999999999 '123456789' -> '-123456788' Inexact Rounded", c9d); TSub("subx666 subtract 1 '123456789' -> '-123456788'", c9d); TSub("subx667 subtract 1.00000001 '123456789' -> '-123456787' Inexact Rounded", c9d); TSub("subx668 subtract 1.00001 '123456789' -> '-123456787' Inexact Rounded", c9d); TSub("subx669 subtract 1.1 '123456789' -> '-123456787' Inexact Rounded", c9d); //-- lots of leading zeros in intermediate result, and showing effects of //-- input rounding would have affected the following //precision: 9 //rounding: half_up TSub("subx670 subtract '123456789' '123456788.1' -> 0.9", c9hu); TSub("subx671 subtract '123456789' '123456788.9' -> 0.1", c9hu); TSub("subx672 subtract '123456789' '123456789.1' -> -0.1", c9hu); TSub("subx673 subtract '123456789' '123456789.5' -> -0.5", c9hu); TSub("subx674 subtract '123456789' '123456789.9' -> -0.9", c9hu); //rounding: half_even TSub("subx680 subtract '123456789' '123456788.1' -> 0.9", c9he); TSub("subx681 subtract '123456789' '123456788.9' -> 0.1", c9he); TSub("subx682 subtract '123456789' '123456789.1' -> -0.1", c9he); TSub("subx683 subtract '123456789' '123456789.5' -> -0.5", c9he); TSub("subx684 subtract '123456789' '123456789.9' -> -0.9", c9he); TSub("subx685 subtract '123456788' '123456787.1' -> 0.9", c9he); TSub("subx686 subtract '123456788' '123456787.9' -> 0.1", c9he); TSub("subx687 subtract '123456788' '123456788.1' -> -0.1", c9he); TSub("subx688 subtract '123456788' '123456788.5' -> -0.5", c9he); TSub("subx689 subtract '123456788' '123456788.9' -> -0.9", c9he); //rounding: down TSub("subx690 subtract '123456789' '123456788.1' -> 0.9", c9d); TSub("subx691 subtract '123456789' '123456788.9' -> 0.1", c9d); TSub("subx692 subtract '123456789' '123456789.1' -> -0.1", c9d); TSub("subx693 subtract '123456789' '123456789.5' -> -0.5", c9d); TSub("subx694 subtract '123456789' '123456789.9' -> -0.9", c9d); //-- input preparation tests //rounding: half_up //precision: 3 TSub("subx700 subtract '12345678900000' -9999999999999 -> '2.23E+13' Inexact Rounded", c3hu); TSub("subx701 subtract '9999999999999' -12345678900000 -> '2.23E+13' Inexact Rounded", c3hu); TSub("subx702 subtract '12E+3' '-3456' -> '1.55E+4' Inexact Rounded", c3hu); TSub("subx703 subtract '12E+3' '-3446' -> '1.54E+4' Inexact Rounded", c3hu); TSub("subx704 subtract '12E+3' '-3454' -> '1.55E+4' Inexact Rounded", c3hu); TSub("subx705 subtract '12E+3' '-3444' -> '1.54E+4' Inexact Rounded", c3hu); TSub("subx706 subtract '3456' '-12E+3' -> '1.55E+4' Inexact Rounded", c3hu); TSub("subx707 subtract '3446' '-12E+3' -> '1.54E+4' Inexact Rounded", c3hu); TSub("subx708 subtract '3454' '-12E+3' -> '1.55E+4' Inexact Rounded", c3hu); TSub("subx709 subtract '3444' '-12E+3' -> '1.54E+4' Inexact Rounded", c3hu); //-- overflow and underflow tests [subnormals now possible] //maxexponent: 999999999 //minexponent: -999999999 //precision: 9 //rounding: down //TSub("subx710 subtract 1E+999999999 -9E+999999999 -> 9.99999999E+999999999 Overflow Inexact Rounded", c9d); //TSub("subx711 subtract 9E+999999999 -1E+999999999 -> 9.99999999E+999999999 Overflow Inexact Rounded", c9d); //rounding: half_up //TSub("subx712 subtract 1E+999999999 -9E+999999999 -> Infinity Overflow Inexact Rounded", c9hu); //TSub("subx713 subtract 9E+999999999 -1E+999999999 -> Infinity Overflow Inexact Rounded", c9hu); //TSub("subx714 subtract -1.1E-999999999 -1E-999999999 -> -1E-1000000000 Subnormal", c9hu); //TSub("subx715 subtract 1E-999999999 +1.1e-999999999 -> -1E-1000000000 Subnormal", c9hu); //TSub("subx716 subtract -1E+999999999 +9E+999999999 -> -Infinity Overflow Inexact Rounded", c9hu); //TSub("subx717 subtract -9E+999999999 +1E+999999999 -> -Infinity Overflow Inexact Rounded", c9hu); //TSub("subx718 subtract +1.1E-999999999 +1E-999999999 -> 1E-1000000000 Subnormal", c9hu); //TSub("subx719 subtract -1E-999999999 -1.1e-999999999 -> 1E-1000000000 Subnormal", c9hu); //precision: 3 //TSub("subx720 subtract 1 9.999E+999999999 -> -Infinity Inexact Overflow Rounded", c3hu); //TSub("subx721 subtract 1 -9.999E+999999999 -> Infinity Inexact Overflow Rounded", c3hu); //TSub("subx722 subtract 9.999E+999999999 1 -> Infinity Inexact Overflow Rounded", c3hu); //TSub("subx723 subtract -9.999E+999999999 1 -> -Infinity Inexact Overflow Rounded", c3hu); //TSub("subx724 subtract 1 9.999E+999999999 -> -Infinity Inexact Overflow Rounded", c3hu); //TSub("subx725 subtract 1 -9.999E+999999999 -> Infinity Inexact Overflow Rounded", c3hu); //TSub("subx726 subtract 9.999E+999999999 1 -> Infinity Inexact Overflow Rounded", c3hu); //TSub("subx727 subtract -9.999E+999999999 1 -> -Infinity Inexact Overflow Rounded", c3hu); //-- [more below] //-- long operand checks //maxexponent: 999 //minexponent: -999 //precision: 9 TSub("sub731 subtract 12345678000 0 -> 1.23456780E+10 Rounded", c9hu); TSub("sub732 subtract 0 12345678000 -> -1.23456780E+10 Rounded", c9hu); TSub("sub733 subtract 1234567800 0 -> 1.23456780E+9 Rounded", c9hu); TSub("sub734 subtract 0 1234567800 -> -1.23456780E+9 Rounded", c9hu); TSub("sub735 subtract 1234567890 0 -> 1.23456789E+9 Rounded", c9hu); TSub("sub736 subtract 0 1234567890 -> -1.23456789E+9 Rounded", c9hu); TSub("sub737 subtract 1234567891 0 -> 1.23456789E+9 Inexact Rounded", c9hu); TSub("sub738 subtract 0 1234567891 -> -1.23456789E+9 Inexact Rounded", c9hu); TSub("sub739 subtract 12345678901 0 -> 1.23456789E+10 Inexact Rounded", c9hu); TSub("sub740 subtract 0 12345678901 -> -1.23456789E+10 Inexact Rounded", c9hu); TSub("sub741 subtract 1234567896 0 -> 1.23456790E+9 Inexact Rounded", c9hu); TSub("sub742 subtract 0 1234567896 -> -1.23456790E+9 Inexact Rounded", c9hu); //precision: 15 TSub("sub751 subtract 12345678000 0 -> 12345678000", c15hu); TSub("sub752 subtract 0 12345678000 -> -12345678000", c15hu); TSub("sub753 subtract 1234567800 0 -> 1234567800", c15hu); TSub("sub754 subtract 0 1234567800 -> -1234567800", c15hu); TSub("sub755 subtract 1234567890 0 -> 1234567890", c15hu); TSub("sub756 subtract 0 1234567890 -> -1234567890", c15hu); TSub("sub757 subtract 1234567891 0 -> 1234567891", c15hu); TSub("sub758 subtract 0 1234567891 -> -1234567891", c15hu); TSub("sub759 subtract 12345678901 0 -> 12345678901", c15hu); TSub("sub760 subtract 0 12345678901 -> -12345678901", c15hu); TSub("sub761 subtract 1234567896 0 -> 1234567896", c15hu); TSub("sub762 subtract 0 1234567896 -> -1234567896", c15hu); //-- Specials //TSub("subx780 subtract -Inf Inf -> -Infinity //TSub("subx781 subtract -Inf 1000 -> -Infinity //TSub("subx782 subtract -Inf 1 -> -Infinity //TSub("subx783 subtract -Inf -0 -> -Infinity //TSub("subx784 subtract -Inf -1 -> -Infinity //TSub("subx785 subtract -Inf -1000 -> -Infinity //TSub("subx787 subtract -1000 Inf -> -Infinity //TSub("subx788 subtract -Inf Inf -> -Infinity //TSub("subx789 subtract -1 Inf -> -Infinity //TSub("subx790 subtract 0 Inf -> -Infinity //TSub("subx791 subtract 1 Inf -> -Infinity //TSub("subx792 subtract 1000 Inf -> -Infinity //TSub("subx800 subtract Inf Inf -> NaN Invalid_operation ///TSub("subx801 subtract Inf 1000 -> Infinity //TSub("subx802 subtract Inf 1 -> Infinity //TSub("subx803 subtract Inf 0 -> Infinity //TSub("subx804 subtract Inf -0 -> Infinity //TSub("subx805 subtract Inf -1 -> Infinity //TSub("subx806 subtract Inf -1000 -> Infinity //TSub("subx807 subtract Inf -Inf -> Infinity //TSub("subx808 subtract -1000 -Inf -> Infinity //TSub("subx809 subtract -Inf -Inf -> NaN Invalid_operation //TSub("subx810 subtract -1 -Inf -> Infinity //TSub("subx811 subtract -0 -Inf -> Infinity //TSub("subx812 subtract 0 -Inf -> Infinity //TSub("subx813 subtract 1 -Inf -> Infinity //TSub("subx814 subtract 1000 -Inf -> Infinity //TSub("subx815 subtract Inf -Inf -> Infinity //TSub("subx821 subtract NaN Inf -> NaN //TSub("subx822 subtract -NaN 1000 -> -NaN //TSub("subx823 subtract NaN 1 -> NaN //TSub("subx824 subtract NaN 0 -> NaN //TSub("subx825 subtract NaN -0 -> NaN //TSub("subx826 subtract NaN -1 -> NaN //TSub("subx827 subtract NaN -1000 -> NaN //TSub("subx828 subtract NaN -Inf -> NaN //TSub("subx829 subtract -NaN NaN -> -NaN //TSub("subx830 subtract -Inf NaN -> NaN //TSub("subx831 subtract -1000 NaN -> NaN //TSub("subx832 subtract -1 NaN -> NaN //TSub("subx833 subtract -0 NaN -> NaN //TSub("subx834 subtract 0 NaN -> NaN //TSub("subx835 subtract 1 NaN -> NaN //TSub("subx836 subtract 1000 -NaN -> -NaN //TSub("subx837 subtract Inf NaN -> NaN //TSub("subx841 subtract sNaN Inf -> NaN Invalid_operation //TSub("subx842 subtract -sNaN 1000 -> -NaN Invalid_operation //TSub("subx843 subtract sNaN 1 -> NaN Invalid_operation //TSub("subx844 subtract sNaN 0 -> NaN Invalid_operation //TSub("subx845 subtract sNaN -0 -> NaN Invalid_operation //TSub("subx846 subtract sNaN -1 -> NaN Invalid_operation //TSub("subx847 subtract sNaN -1000 -> NaN Invalid_operation //TSub("subx848 subtract sNaN NaN -> NaN Invalid_operation //TSub("subx849 subtract sNaN sNaN -> NaN Invalid_operation //TSub("subx850 subtract NaN sNaN -> NaN Invalid_operation //TSub("subx851 subtract -Inf -sNaN -> -NaN Invalid_operation //TSub("subx852 subtract -1000 sNaN -> NaN Invalid_operation //TSub("subx853 subtract -1 sNaN -> NaN Invalid_operation //TSub("subx854 subtract -0 sNaN -> NaN Invalid_operation //TSub("subx855 subtract 0 sNaN -> NaN Invalid_operation //TSub("subx856 subtract 1 sNaN -> NaN Invalid_operation //TSub("subx857 subtract 1000 sNaN -> NaN Invalid_operation //TSub("subx858 subtract Inf sNaN -> NaN Invalid_operation //TSub("subx859 subtract NaN sNaN -> NaN Invalid_operation //-- propagating NaNs //TSub("subx861 subtract NaN01 -Inf -> NaN1 //TSub("subx862 subtract -NaN02 -1000 -> -NaN2 //TSub("subx863 subtract NaN03 1000 -> NaN3 //TSub("subx864 subtract NaN04 Inf -> NaN4 //TSub("subx865 subtract NaN05 NaN61 -> NaN5 //TSub("subx866 subtract -Inf -NaN71 -> -NaN71 //TSub("subx867 subtract -1000 NaN81 -> NaN81 //TSub("subx868 subtract 1000 NaN91 -> NaN91 //TSub("subx869 subtract Inf NaN101 -> NaN101 //TSub("subx871 subtract sNaN011 -Inf -> NaN11 Invalid_operation //TSub("subx872 subtract sNaN012 -1000 -> NaN12 Invalid_operation //TSub("subx873 subtract -sNaN013 1000 -> -NaN13 Invalid_operation //TSub("subx874 subtract sNaN014 NaN171 -> NaN14 Invalid_operation //TSub("subx875 subtract sNaN015 sNaN181 -> NaN15 Invalid_operation //TSub("subx876 subtract NaN016 sNaN191 -> NaN191 Invalid_operation //TSub("subx877 subtract -Inf sNaN201 -> NaN201 Invalid_operation //TSub("subx878 subtract -1000 sNaN211 -> NaN211 Invalid_operation //TSub("subx879 subtract 1000 -sNaN221 -> -NaN221 Invalid_operation //TSub("subx880 subtract Inf sNaN231 -> NaN231 Invalid_operation //TSub("subx881 subtract NaN025 sNaN241 -> NaN241 Invalid_operation //-- edge case spills TSub("subx901 subtract 2.E-3 1.002 -> -1.000", c15hu); TSub("subx902 subtract 2.0E-3 1.002 -> -1.0000", c15hu); TSub("subx903 subtract 2.00E-3 1.0020 -> -1.00000", c15hu); TSub("subx904 subtract 2.000E-3 1.00200 -> -1.000000", c15hu); TSub("subx905 subtract 2.0000E-3 1.002000 -> -1.0000000", c15hu); TSub("subx906 subtract 2.00000E-3 1.0020000 -> -1.00000000", c15hu); TSub("subx907 subtract 2.000000E-3 1.00200000 -> -1.000000000", c15hu); TSub("subx908 subtract 2.0000000E-3 1.002000000 -> -1.0000000000", c15hu); //-- subnormals and underflows //precision: 3 //maxexponent: 999 //minexponent: -999 TSub("subx1010 subtract 0 1.00E-999 -> -1.00E-999", c3hu); TSub("subx1011 subtract 0 0.1E-999 -> -1E-1000 Subnormal", c3hu); TSub("subx1012 subtract 0 0.10E-999 -> -1.0E-1000 Subnormal", c3hu); //?TSub("subx1013 subtract 0 0.100E-999 -> -1.0E-1000 Subnormal Rounded", c3hu); TSub("subx1014 subtract 0 0.01E-999 -> -1E-1001 Subnormal", c3hu); //-- next is rounded to Emin //?TSub("subx1015 subtract 0 0.999E-999 -> -1.00E-999 Inexact Rounded Subnormal Underflow", c3hu); //?TSub("subx1016 subtract 0 0.099E-999 -> -1.0E-1000 Inexact Rounded Subnormal Underflow", c3hu); //?TSub("subx1017 subtract 0 0.009E-999 -> -1E-1001 Inexact Rounded Subnormal Underflow", c3hu); //?TSub("subx1018 subtract 0 0.001E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow Clamped", c3hu); //?TSub("subx1019 subtract 0 0.0009E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow Clamped", c3hu); //?TSub("subx1020 subtract 0 0.0001E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow Clamped", c3hu); //?TSub("subx1030 subtract 0 -1.00E-999 -> 1.00E-999", c3hu); //?TSub("subx1031 subtract 0 -0.1E-999 -> 1E-1000 Subnormal", c3hu); //?TSub("subx1032 subtract 0 -0.10E-999 -> 1.0E-1000 Subnormal", c3hu); //?TSub("subx1033 subtract 0 -0.100E-999 -> 1.0E-1000 Subnormal Rounded", c3hu); //?TSub("subx1034 subtract 0 -0.01E-999 -> 1E-1001 Subnormal", c3hu); //-- next is rounded to Emin //?TSub("subx1035 subtract 0 -0.999E-999 -> 1.00E-999 Inexact Rounded Subnormal Underflow", c3hu); //?TSub("subx1036 subtract 0 -0.099E-999 -> 1.0E-1000 Inexact Rounded Subnormal Underflow", c3hu); //?TSub("subx1037 subtract 0 -0.009E-999 -> 1E-1001 Inexact Rounded Subnormal Underflow", c3hu); //?TSub("subx1038 subtract 0 -0.001E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow Clamped", c3hu); //?TSub("subx1039 subtract 0 -0.0009E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow Clamped", c3hu); //?TSub("subx1040 subtract 0 -0.0001E-999 -> 0E-1001 Inexact Rounded Subnormal Underflow Clamped", c3hu); //-- some non-zero subnormal subtracts //-- TSub("subx1056 is a tricky case //rounding: half_up //?TSub("subx1050 subtract 1.00E-999 0.1E-999 -> 9.0E-1000 Subnormal", c3hu); //?TSub("subx1051 subtract 0.1E-999 0.1E-999 -> 0E-1000", c3hu); //?TSub("subx1052 subtract 0.10E-999 0.1E-999 -> 0E-1001", c3hu); //?TSub("subx1053 subtract 0.100E-999 0.1E-999 -> 0E-1001 Clamped", c3hu); //?TSub("subx1054 subtract 0.01E-999 0.1E-999 -> -9E-1001 Subnormal", c3hu); //?TSub("subx1055 subtract 0.999E-999 0.1E-999 -> 9.0E-1000 Inexact Rounded Subnormal Underflow", c3hu); //?TSub("subx1056 subtract 0.099E-999 0.1E-999 -> -0E-1001 Inexact Rounded Subnormal Underflow Clamped", c3hu); //?TSub("subx1057 subtract 0.009E-999 0.1E-999 -> -9E-1001 Inexact Rounded Subnormal Underflow", c3hu); //?TSub("subx1058 subtract 0.001E-999 0.1E-999 -> -1.0E-1000 Inexact Rounded Subnormal Underflow", c3hu); //?TSub("subx1059 subtract 0.0009E-999 0.1E-999 -> -1.0E-1000 Inexact Rounded Subnormal Underflow", c3hu); //?TSub("subx1060 subtract 0.0001E-999 0.1E-999 -> -1.0E-1000 Inexact Rounded Subnormal Underflow", c3hu); //-- check for double-rounded subnormals //precision: 5 //maxexponent: 79 //minexponent: -79 //?TSub("subx1101 subtract 0 1.52444E-80 -> -1.524E-80 Inexact Rounded Subnormal Underflow", c5hu); //?TSub("subx1102 subtract 0 1.52445E-80 -> -1.524E-80 Inexact Rounded Subnormal Underflow", c5hu); //?TSub("subx1103 subtract 0 1.52446E-80 -> -1.524E-80 Inexact Rounded Subnormal Underflow", c5hu); //?TSub("subx1104 subtract 1.52444E-80 0 -> 1.524E-80 Inexact Rounded Subnormal Underflow", c5hu); //?TSub("subx1105 subtract 1.52445E-80 0 -> 1.524E-80 Inexact Rounded Subnormal Underflow", c5hu); //?TSub("subx1106 subtract 1.52446E-80 0 -> 1.524E-80 Inexact Rounded Subnormal Underflow", c5hu); //?TSub("subx1111 subtract 1.2345678E-80 1.2345671E-80 -> 0E-83 Inexact Rounded Subnormal Underflow Clamped", c5hu); //?TSub("subx1112 subtract 1.2345678E-80 1.2345618E-80 -> 0E-83 Inexact Rounded Subnormal Underflow Clamped", c5hu); //?TSub("subx1113 subtract 1.2345678E-80 1.2345178E-80 -> 0E-83 Inexact Rounded Subnormal Underflow Clamped", c5hu); //?TSub("subx1114 subtract 1.2345678E-80 1.2341678E-80 -> 0E-83 Inexact Rounded Subnormal Underflow Clamped", c5hu); //?TSub("subx1115 subtract 1.2345678E-80 1.2315678E-80 -> 3E-83 Rounded Subnormal", c5hu); //?TSub("subx1116 subtract 1.2345678E-80 1.2145678E-80 -> 2.0E-82 Rounded Subnormal", c5hu); //?TSub("subx1117 subtract 1.2345678E-80 1.1345678E-80 -> 1.00E-81 Rounded Subnormal", c5hu); //?TSub("subx1118 subtract 1.2345678E-80 0.2345678E-80 -> 1.000E-80 Rounded Subnormal", c5hu); //precision: 34 //rounding: half_up //maxExponent: 6144 //minExponent: -6143 //-- Examples from SQL proposal (Krishna Kulkarni) BigDecimal.Context c34hu = new BigDecimal.Context(34, BigDecimal.RoundingMode.HalfUp); TSub("subx1125 subtract 130E-2 120E-2 -> 0.10", c34hu); TSub("subx1126 subtract 130E-2 12E-1 -> 0.10", c34hu); TSub("subx1127 subtract 130E-2 1E0 -> 0.30", c34hu); TSub("subx1128 subtract 1E2 1E4 -> -9.9E+3", c34hu); //-- Null tests //subx9990 subtract 10 # -> NaN Invalid_operation //subx9991 subtract # 10 -> NaN Invalid_operation }
public void DivideTestNoContext() { BigDecimal.Context c0u = new BigDecimal.Context(0, BigDecimal.RoundingMode.Unnecessary); //-- sanity checks TDiv("divx001 divide 1 1 -> 1", c0u); TDiv("divx002 divide 2 1 -> 2", c0u); TDiv("divx003 divide 1 2 -> 0.5", c0u); TDiv("divx004 divide 2 2 -> 1", c0u); TDiv("divx005 divide 0 1 -> 0", c0u); TDiv("divx006 divide 0 2 -> 0", c0u); TDivEx("divx007 divide 1 3 -> 0.333333333 Inexact Rounded", c0u); TDivEx("divx008 divide 2 3 -> 0.666666667 Inexact Rounded", c0u); TDiv("divx009 divide 3 3 -> 1", c0u); TDiv("divx010 divide 2.4 1 -> 2.4", c0u); TDiv("divx011 divide 2.4 -1 -> -2.4", c0u); }
public void SpecTestDivInt() { BigDecimal.Context c9hu = new BigDecimal.Context(9, BigDecimal.RoundingMode.HalfUp); //extended: 1 //precision: 9 //rounding: half_up //maxExponent: 384 //minexponent: -383 TDivI("dvix001 divideint 1 1 -> 1", c9hu); TDivI("dvix002 divideint 2 1 -> 2", c9hu); TDivI("dvix003 divideint 1 2 -> 0", c9hu); TDivI("dvix004 divideint 2 2 -> 1", c9hu); TDivI("dvix005 divideint 0 1 -> 0", c9hu); TDivI("dvix006 divideint 0 2 -> 0", c9hu); TDivI("dvix007 divideint 1 3 -> 0", c9hu); TDivI("dvix008 divideint 2 3 -> 0", c9hu); TDivI("dvix009 divideint 3 3 -> 1", c9hu); TDivI("dvix010 divideint 2.4 1 -> 2", c9hu); TDivI("dvix011 divideint 2.4 -1 -> -2", c9hu); TDivI("dvix012 divideint -2.4 1 -> -2", c9hu); TDivI("dvix013 divideint -2.4 -1 -> 2", c9hu); TDivI("dvix014 divideint 2.40 1 -> 2", c9hu); TDivI("dvix015 divideint 2.400 1 -> 2", c9hu); TDivI("dvix016 divideint 2.4 2 -> 1", c9hu); TDivI("dvix017 divideint 2.400 2 -> 1", c9hu); TDivI("dvix018 divideint 2. 2 -> 1", c9hu); TDivI("dvix019 divideint 20 20 -> 1", c9hu); TDivI("dvix020 divideint 187 187 -> 1", c9hu); TDivI("dvix021 divideint 5 2 -> 2", c9hu); TDivI("dvix022 divideint 5 2.0 -> 2", c9hu); TDivI("dvix023 divideint 5 2.000 -> 2", c9hu); TDivI("dvix024 divideint 5 0.200 -> 25", c9hu); TDivI("dvix025 divideint 5 0.200 -> 25", c9hu); TDivI("dvix030 divideint 1 2 -> 0", c9hu); TDivI("dvix031 divideint 1 4 -> 0", c9hu); TDivI("dvix032 divideint 1 8 -> 0", c9hu); TDivI("dvix033 divideint 1 16 -> 0", c9hu); TDivI("dvix034 divideint 1 32 -> 0", c9hu); TDivI("dvix035 divideint 1 64 -> 0", c9hu); TDivI("dvix040 divideint 1 -2 -> 0", c9hu); // mod: neg zero TDivI("dvix041 divideint 1 -4 -> 0", c9hu); // mod: neg zero TDivI("dvix042 divideint 1 -8 -> 0", c9hu); // mod: neg zero TDivI("dvix043 divideint 1 -16 -> 0", c9hu); // mod: neg zero TDivI("dvix044 divideint 1 -32 -> 0", c9hu); // mod: neg zero TDivI("dvix045 divideint 1 -64 -> 0", c9hu); // mod: neg zero TDivI("dvix050 divideint -1 2 -> 0", c9hu); // mod: neg zero TDivI("dvix051 divideint -1 4 -> 0", c9hu); // mod: neg zero TDivI("dvix052 divideint -1 8 -> 0", c9hu); // mod: neg zero TDivI("dvix053 divideint -1 16 -> 0", c9hu); // mod: neg zero TDivI("dvix054 divideint -1 32 -> 0", c9hu); // mod: neg zero TDivI("dvix055 divideint -1 64 -> 0", c9hu); // mod: neg zero TDivI("dvix060 divideint -1 -2 -> 0", c9hu); TDivI("dvix061 divideint -1 -4 -> 0", c9hu); TDivI("dvix062 divideint -1 -8 -> 0", c9hu); TDivI("dvix063 divideint -1 -16 -> 0", c9hu); TDivI("dvix064 divideint -1 -32 -> 0", c9hu); TDivI("dvix065 divideint -1 -64 -> 0", c9hu); //-- similar with powers of ten TDivI("dvix160 divideint 1 1 -> 1", c9hu); TDivI("dvix161 divideint 1 10 -> 0", c9hu); TDivI("dvix162 divideint 1 100 -> 0", c9hu); TDivI("dvix163 divideint 1 1000 -> 0", c9hu); TDivI("dvix164 divideint 1 10000 -> 0", c9hu); TDivI("dvix165 divideint 1 100000 -> 0", c9hu); TDivI("dvix166 divideint 1 1000000 -> 0", c9hu); TDivI("dvix167 divideint 1 10000000 -> 0", c9hu); TDivI("dvix168 divideint 1 100000000 -> 0", c9hu); TDivI("dvix170 divideint 1 -1 -> -1", c9hu); TDivI("dvix171 divideint 1 -10 -> 0", c9hu); // mod: neg zero TDivI("dvix172 divideint 1 -100 -> 0", c9hu); // mod: neg zero TDivI("dvix173 divideint 1 -1000 -> 0", c9hu); // mod: neg zero TDivI("dvix174 divideint 1 -10000 -> 0", c9hu); // mod: neg zero TDivI("dvix175 divideint 1 -100000 -> 0", c9hu); // mod: neg zero TDivI("dvix176 divideint 1 -1000000 -> 0", c9hu); // mod: neg zero TDivI("dvix177 divideint 1 -10000000 -> 0", c9hu); // mod: neg zero TDivI("dvix178 divideint 1 -100000000 -> 0", c9hu); // mod: neg zero TDivI("dvix180 divideint -1 1 -> -1", c9hu); TDivI("dvix181 divideint -1 10 -> 0", c9hu); // mod: neg zero TDivI("dvix182 divideint -1 100 -> 0", c9hu); // mod: neg zero TDivI("dvix183 divideint -1 1000 -> 0", c9hu); // mod: neg zero TDivI("dvix184 divideint -1 10000 -> 0", c9hu); // mod: neg zero TDivI("dvix185 divideint -1 100000 -> 0", c9hu); // mod: neg zero TDivI("dvix186 divideint -1 1000000 -> 0", c9hu); // mod: neg zero TDivI("dvix187 divideint -1 10000000 -> 0", c9hu); // mod: neg zero TDivI("dvix188 divideint -1 100000000 -> 0", c9hu); // mod: neg zero TDivI("dvix190 divideint -1 -1 -> 1", c9hu); TDivI("dvix191 divideint -1 -10 -> 0", c9hu); TDivI("dvix192 divideint -1 -100 -> 0", c9hu); TDivI("dvix193 divideint -1 -1000 -> 0", c9hu); TDivI("dvix194 divideint -1 -10000 -> 0", c9hu); TDivI("dvix195 divideint -1 -100000 -> 0", c9hu); TDivI("dvix196 divideint -1 -1000000 -> 0", c9hu); TDivI("dvix197 divideint -1 -10000000 -> 0", c9hu); TDivI("dvix198 divideint -1 -100000000 -> 0", c9hu); //-- some long operand cases here TDivI("dvix070 divideint 999999999 1 -> 999999999", c9hu); TDivI("dvix071 divideint 999999999.4 1 -> 999999999", c9hu); TDivI("dvix072 divideint 999999999.5 1 -> 999999999", c9hu); TDivI("dvix073 divideint 999999999.9 1 -> 999999999", c9hu); TDivI("dvix074 divideint 999999999.999 1 -> 999999999", c9hu); //precision: 6 BigDecimal.Context c6hu = new BigDecimal.Context(6, BigDecimal.RoundingMode.HalfUp); TDivIEx("dvix080 divideint 999999999 1 -> NaN Division_impossible", c6hu); TDivIEx("dvix081 divideint 99999999 1 -> NaN Division_impossible", c6hu); TDivIEx("dvix082 divideint 9999999 1 -> NaN Division_impossible", c6hu); TDivI("dvix083 divideint 999999 1 -> 999999", c6hu); TDivI("dvix084 divideint 99999 1 -> 99999", c6hu); TDivI("dvix085 divideint 9999 1 -> 9999", c6hu); TDivI("dvix086 divideint 999 1 -> 999", c6hu); TDivI("dvix087 divideint 99 1 -> 99", c6hu); TDivI("dvix088 divideint 9 1 -> 9", c6hu); //precision: 9 TDivI("dvix090 divideint 0. 1 -> 0", c9hu); TDivI("dvix091 divideint .0 1 -> 0", c9hu); TDivI("dvix092 divideint 0.00 1 -> 0", c9hu); TDivI("dvix093 divideint 0.00E+9 1 -> 0", c9hu); TDivI("dvix094 divideint 0.0000E-50 1 -> 0", c9hu); TDivI("dvix100 divideint 1 1 -> 1", c9hu); TDivI("dvix101 divideint 1 2 -> 0", c9hu); TDivI("dvix102 divideint 1 3 -> 0", c9hu); TDivI("dvix103 divideint 1 4 -> 0", c9hu); TDivI("dvix104 divideint 1 5 -> 0", c9hu); TDivI("dvix105 divideint 1 6 -> 0", c9hu); TDivI("dvix106 divideint 1 7 -> 0", c9hu); TDivI("dvix107 divideint 1 8 -> 0", c9hu); TDivI("dvix108 divideint 1 9 -> 0", c9hu); TDivI("dvix109 divideint 1 10 -> 0", c9hu); TDivI("dvix110 divideint 1 1 -> 1", c9hu); TDivI("dvix111 divideint 2 1 -> 2", c9hu); TDivI("dvix112 divideint 3 1 -> 3", c9hu); TDivI("dvix113 divideint 4 1 -> 4", c9hu); TDivI("dvix114 divideint 5 1 -> 5", c9hu); TDivI("dvix115 divideint 6 1 -> 6", c9hu); TDivI("dvix116 divideint 7 1 -> 7", c9hu); TDivI("dvix117 divideint 8 1 -> 8", c9hu); TDivI("dvix118 divideint 9 1 -> 9", c9hu); TDivI("dvix119 divideint 10 1 -> 10", c9hu); //-- from DiagBigDecimal TDivI("dvix131 divideint 101.3 1 -> 101", c9hu); TDivI("dvix132 divideint 101.0 1 -> 101", c9hu); TDivI("dvix133 divideint 101.3 3 -> 33", c9hu); TDivI("dvix134 divideint 101.0 3 -> 33", c9hu); TDivI("dvix135 divideint 2.4 1 -> 2", c9hu); TDivI("dvix136 divideint 2.400 1 -> 2", c9hu); TDivI("dvix137 divideint 18 18 -> 1", c9hu); TDivI("dvix138 divideint 1120 1000 -> 1", c9hu); TDivI("dvix139 divideint 2.4 2 -> 1", c9hu); TDivI("dvix140 divideint 2.400 2 -> 1", c9hu); TDivI("dvix141 divideint 0.5 2.000 -> 0", c9hu); TDivI("dvix142 divideint 8.005 7 -> 1", c9hu); TDivI("dvix143 divideint 5 2 -> 2", c9hu); TDivI("dvix144 divideint 0 2 -> 0", c9hu); TDivI("dvix145 divideint 0.00 2 -> 0", c9hu); //-- Others TDivI("dvix150 divideint 12345 4.999 -> 2469", c9hu); TDivI("dvix151 divideint 12345 4.99 -> 2473", c9hu); TDivI("dvix152 divideint 12345 4.9 -> 2519", c9hu); TDivI("dvix153 divideint 12345 5 -> 2469", c9hu); TDivI("dvix154 divideint 12345 5.1 -> 2420", c9hu); TDivI("dvix155 divideint 12345 5.01 -> 2464", c9hu); TDivI("dvix156 divideint 12345 5.001 -> 2468", c9hu); TDivI("dvix157 divideint 101 7.6 -> 13", c9hu); //-- Various flavours of divideint by 0 //maxexponent: 999999999 //minexponent: -999999999 TDivIEx("dvix201 divideint 0 0 -> NaN Division_undefined", c9hu); TDivIEx("dvix202 divideint 0.0E5 0 -> NaN Division_undefined", c9hu); TDivIEx("dvix203 divideint 0.000 0 -> NaN Division_undefined", c9hu); TDivIEx("dvix204 divideint 0.0001 0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix205 divideint 0.01 0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix206 divideint 0.1 0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix207 divideint 1 0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix208 divideint 1 0.0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix209 divideint 10 0.0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix210 divideint 1E+100 0.0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix211 divideint 1E+1000 0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix214 divideint -0.0001 0 -> -Infinity Division_by_zero", c9hu); TDivIEx("dvix215 divideint -0.01 0 -> -Infinity Division_by_zero", c9hu); TDivIEx("dvix216 divideint -0.1 0 -> -Infinity Division_by_zero", c9hu); TDivIEx("dvix217 divideint -1 0 -> -Infinity Division_by_zero", c9hu); TDivIEx("dvix218 divideint -1 0.0 -> -Infinity Division_by_zero", c9hu); TDivIEx("dvix219 divideint -10 0.0 -> -Infinity Division_by_zero", c9hu); TDivIEx("dvix220 divideint -1E+100 0.0 -> -Infinity Division_by_zero", c9hu); TDivIEx("dvix221 divideint -1E+1000 0 -> -Infinity Division_by_zero", c9hu); // TODO: Reactivate these tests when we can handle the align (irrelevant when the numbers are so different) // -- test some cases that are close to exponent overflow //maxexponent: 999999999 //minexponent: -999999999 //TDivI("dvix270 divideint 1 1e999999999 -> 0", c9hu); //TDivI("dvix271 divideint 1 0.9e999999999 -> 0", c9hu); //TDivI("dvix272 divideint 1 0.99e999999999 -> 0", c9hu); //TDivI("dvix273 divideint 1 0.999999999e999999999 -> 0", c9hu); //TDivIEx("dvix274 divideint 9e999999999 1 -> NaN Division_impossible", c9hu); //TDivIEx("dvix275 divideint 9.9e999999999 1 -> NaN Division_impossible", c9hu); //TDivIEx("dvix276 divideint 9.99e999999999 1 -> NaN Division_impossible", c9hu); //TDivIEx("dvix277 divideint 9.99999999e999999999 1 -> NaN Division_impossible", c9hu); //TDivIEx("dvix280 divideint 0.1 9e-999999999 -> NaN Division_impossible", c9hu); //TDivIEx("dvix281 divideint 0.1 99e-999999999 -> NaN Division_impossible", c9hu); //TDivIEx("dvix282 divideint 0.1 999e-999999999 -> NaN Division_impossible", c9hu); //TDivIEx("dvix283 divideint 0.1 9e-999999998 -> NaN Division_impossible", c9hu); //TDivIEx("dvix284 divideint 0.1 99e-999999998 -> NaN Division_impossible", c9hu); //TDivIEx("dvix285 divideint 0.1 999e-999999998 -> NaN Division_impossible", c9hu); //TDivIEx("dvix286 divideint 0.1 999e-999999997 -> NaN Division_impossible", c9hu); //TDivIEx("dvix287 divideint 0.1 9999e-999999997 -> NaN Division_impossible", c9hu); //TDivIEx("dvix288 divideint 0.1 99999e-999999997 -> NaN Division_impossible", c9hu); //-- GD edge cases: lhs smaller than rhs but more digits TDivI("dvix301 divideint 0.9 2 -> 0", c9hu); TDivI("dvix302 divideint 0.9 2.0 -> 0", c9hu); TDivI("dvix303 divideint 0.9 2.1 -> 0", c9hu); TDivI("dvix304 divideint 0.9 2.00 -> 0", c9hu); TDivI("dvix305 divideint 0.9 2.01 -> 0", c9hu); TDivI("dvix306 divideint 0.12 1 -> 0", c9hu); TDivI("dvix307 divideint 0.12 1.0 -> 0", c9hu); TDivI("dvix308 divideint 0.12 1.00 -> 0", c9hu); TDivI("dvix309 divideint 0.12 1.0 -> 0", c9hu); TDivI("dvix310 divideint 0.12 1.00 -> 0", c9hu); TDivI("dvix311 divideint 0.12 2 -> 0", c9hu); TDivI("dvix312 divideint 0.12 2.0 -> 0", c9hu); TDivI("dvix313 divideint 0.12 2.1 -> 0", c9hu); TDivI("dvix314 divideint 0.12 2.00 -> 0", c9hu); TDivI("dvix315 divideint 0.12 2.01 -> 0", c9hu); //-- overflow and underflow tests [from divide] //maxexponent: 999999999 //minexponent: -999999999 //TDivI("dvix330 divideint +1.23456789012345E-0 9E+999999999 -> 0", c9hu); //TDivIEx("dvix331 divideint 9E+999999999 +0.23456789012345E-0 -> NaN Division_impossible", c9hu); //TDivI("dvix332 divideint +0.100 9E+999999999 -> 0", c9hu); //TDivI("dvix333 divideint 9E-999999999 +9.100 -> 0", c9hu); //TDivI("dvix335 divideint -1.23456789012345E-0 9E+999999999 -> -0", c9hu); //TDivIEx("dvix336 divideint 9E+999999999 -0.83456789012345E-0 -> NaN Division_impossible", c9hu); //TDivI("dvix337 divideint -0.100 9E+999999999 -> -0", c9hu); //TDivI("dvix338 divideint 9E-999999999 -9.100 -> -0", c9hu); //-- long operand checks //maxexponent: 999 //minexponent: -999 //precision: 9 TDivI("dvix401 divideint 12345678000 100 -> 123456780", c9hu); TDivI("dvix402 divideint 1 12345678000 -> 0", c9hu); TDivI("dvix403 divideint 1234567800 10 -> 123456780", c9hu); TDivI("dvix404 divideint 1 1234567800 -> 0", c9hu); TDivI("dvix405 divideint 1234567890 10 -> 123456789", c9hu); TDivI("dvix406 divideint 1 1234567890 -> 0", c9hu); TDivI("dvix407 divideint 1234567891 10 -> 123456789", c9hu); TDivI("dvix408 divideint 1 1234567891 -> 0", c9hu); TDivI("dvix409 divideint 12345678901 100 -> 123456789", c9hu); TDivI("dvix410 divideint 1 12345678901 -> 0", c9hu); TDivI("dvix411 divideint 1234567896 10 -> 123456789", c9hu); TDivI("dvix412 divideint 1 1234567896 -> 0", c9hu); TDivI("dvix413 divideint 12345678948 100 -> 123456789", c9hu); TDivI("dvix414 divideint 12345678949 100 -> 123456789", c9hu); TDivI("dvix415 divideint 12345678950 100 -> 123456789", c9hu); TDivI("dvix416 divideint 12345678951 100 -> 123456789", c9hu); TDivI("dvix417 divideint 12345678999 100 -> 123456789", c9hu); //precision: 15 BigDecimal.Context c15hu = new BigDecimal.Context(15, BigDecimal.RoundingMode.HalfUp); TDivI("dvix441 divideint 12345678000 1 -> 12345678000", c15hu); TDivI("dvix442 divideint 1 12345678000 -> 0", c15hu); TDivI("dvix443 divideint 1234567800 1 -> 1234567800", c15hu); TDivI("dvix444 divideint 1 1234567800 -> 0", c15hu); TDivI("dvix445 divideint 1234567890 1 -> 1234567890", c15hu); TDivI("dvix446 divideint 1 1234567890 -> 0", c9hu); TDivI("dvix447 divideint 1234567891 1 -> 1234567891", c15hu); TDivI("dvix448 divideint 1 1234567891 -> 0", c9hu); TDivI("dvix449 divideint 12345678901 1 -> 12345678901", c15hu); TDivI("dvix450 divideint 1 12345678901 -> 0", c15hu); TDivI("dvix451 divideint 1234567896 1 -> 1234567896", c15hu); TDivI("dvix452 divideint 1 1234567896 -> 0", c15hu); //precision: 9 //rounding: half_up //maxExponent: 999 //minexponent: -999 //-- more zeros, etc. TDivI("dvix531 divideint 5.00 1E-3 -> 5000", c9hu); TDivIEx("dvix532 divideint 00.00 0.000 -> NaN Division_undefined", c9hu); TDivIEx("dvix533 divideint 00.00 0E-3 -> NaN Division_undefined", c9hu); TDivIEx("dvix534 divideint 0 -0 -> NaN Division_undefined", c9hu); TDivIEx("dvix535 divideint -0 0 -> NaN Division_undefined", c9hu); TDivIEx("dvix536 divideint -0 -0 -> NaN Division_undefined", c9hu); TDivI("dvix541 divideint 0 -1 -> 0", c9hu); // mod: neg zero TDivI("dvix542 divideint -0 -1 -> 0", c9hu); TDivI("dvix543 divideint 0 1 -> 0", c9hu); TDivI("dvix544 divideint -0 1 -> 0", c9hu); // mod: neg zero TDivIEx("dvix545 divideint -1 0 -> -Infinity Division_by_zero", c9hu); TDivIEx("dvix546 divideint -1 -0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix547 divideint 1 0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix548 divideint 1 -0 -> -Infinity Division_by_zero", c9hu); TDivI("dvix551 divideint 0.0 -1 -> 0", c9hu); // mod: neg zero TDivI("dvix552 divideint -0.0 -1 -> 0", c9hu); TDivI("dvix553 divideint 0.0 1 -> 0", c9hu); TDivI("dvix554 divideint -0.0 1 -> 0", c9hu); // mod: neg zero TDivIEx("dvix555 divideint -1.0 0 -> -Infinity Division_by_zero", c9hu); TDivIEx("dvix556 divideint -1.0 -0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix557 divideint 1.0 0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix558 divideint 1.0 -0 -> -Infinity Division_by_zero", c9hu); TDivI("dvix561 divideint 0 -1.0 -> 0", c9hu); // mod: neg zero TDivI("dvix562 divideint -0 -1.0 -> 0", c9hu); TDivI("dvix563 divideint 0 1.0 -> 0", c9hu); TDivI("dvix564 divideint -0 1.0 -> 0", c9hu); // mod: neg zero TDivIEx("dvix565 divideint -1 0.0 -> -Infinity Division_by_zero", c9hu); TDivIEx("dvix566 divideint -1 -0.0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix567 divideint 1 0.0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix568 divideint 1 -0.0 -> -Infinity Division_by_zero", c9hu); TDivI("dvix571 divideint 0.0 -1.0 -> 0", c9hu); // mod: neg zero TDivI("dvix572 divideint -0.0 -1.0 -> 0", c9hu); TDivI("dvix573 divideint 0.0 1.0 -> 0", c9hu); TDivI("dvix574 divideint -0.0 1.0 -> 0", c9hu); // mod: neg zero TDivIEx("dvix575 divideint -1.0 0.0 -> -Infinity Division_by_zero", c9hu); TDivIEx("dvix576 divideint -1.0 -0.0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix577 divideint 1.0 0.0 -> Infinity Division_by_zero", c9hu); TDivIEx("dvix578 divideint 1.0 -0.0 -> -Infinity Division_by_zero", c9hu); }
public void CanCreateFromDouble() { BigDecimal.Context c9hu = new BigDecimal.Context(9, BigDecimal.RoundingMode.HalfUp); TestDouble(0.0, "0", c9hu); TestDouble(0.0000, "0", c9hu); TestDouble(1.0, "1", c9hu); TestDouble(10.0, "10.0000000", c9hu); TestDouble(100.0, "100.000000", c9hu); TestDouble(1000.0, "1000.00000", c9hu); TestDouble(10000.0, "10000.0000", c9hu); TestDouble(100000.0, "100000.000", c9hu); TestDouble(1000000.0, "1000000.00", c9hu); TestDouble(10000000.0, "10000000.0", c9hu); TestDouble(100000000.0, "100000000", c9hu); TestDouble(1000000000.0, "1.00000000E+9", c9hu); TestDouble(10000000000.0, "1.00000000E+10", c9hu); TestDouble(100000000000.0, "1.00000000E+11", c9hu); TestDouble(1000000000000.0, "1.00000000E+12", c9hu); TestDouble(10000000000000.0, "1.00000000E+13", c9hu); TestDouble(100000000000000.0, "1.00000000E+14", c9hu); TestDouble(1.0E10, "1.00000000E+10", c9hu); TestDouble(1.0E20, "1.00000000E+20", c9hu); TestDouble(1.0E30, "1.00000000E+30", c9hu); TestDouble(1.0E40, "1.00000000E+40", c9hu); TestDouble(1.0E50, "1.00000000E+50", c9hu); TestDouble(1.0E60, "1.00000000E+60", c9hu); TestDouble(1.0E70, "1.00000000E+70", c9hu); TestDouble(.1, "0.100000000", c9hu); TestDouble(.01, "0.0100000000", c9hu); TestDouble(.001, "0.00100000000", c9hu); TestDouble(.0001, "0.000100000000", c9hu); TestDouble(.00001, "0.0000100000000", c9hu); TestDouble(.000001, "0.00000100000000", c9hu); TestDouble(.0000001, "1.00000000E-7", c9hu); TestDouble(.00000001, "1.00000000E-8", c9hu); TestDouble(.000000001, "1.00000000E-9", c9hu); TestDouble(.0000000001, "1.00000000E-10", c9hu); TestDouble(.00000000001, "1.00000000E-11", c9hu); TestDouble(.000000000001, "1.00000000E-12", c9hu); TestDouble(.0000000000001, "1.00000000E-13", c9hu); TestDouble(.00000000000001, "1.00000000E-14", c9hu); TestDouble(1.0E-10, "1.00000000E-10", c9hu); TestDouble(1.0E-20, "1.00000000E-20", c9hu); TestDouble(1.0E-30, "1.00000000E-30", c9hu); TestDouble(1.0E-40, "1.00000000E-40", c9hu); TestDouble(1.0E-50, "1.00000000E-50", c9hu); TestDouble(1.0E-60, "1.00000000E-60", c9hu); TestDouble(1.0E-70, "1.00000000E-70", c9hu); // POwers of two have their own representations. TestDouble(2.0, "2", c9hu); TestDouble(4.0, "4", c9hu); TestDouble(8.0, "8", c9hu); TestDouble(16.0, "16", c9hu); TestDouble(32.0, "32", c9hu); TestDouble(64.0, "64", c9hu); TestDouble(128.0, "128", c9hu); TestDouble(256.0, "256", c9hu); TestDouble(512.0, "512", c9hu); TestDouble(1024.0, "1024", c9hu); TestDouble(1024.0 * 1024, "1048576", c9hu); TestDouble(1024.0 * 1024 * 1024, "1.07374182E+9", c9hu); TestDouble(1 / 2.0, "0.5", c9hu); TestDouble(1 / 4.0, "0.25", c9hu); TestDouble(1 / 8.0, "0.125", c9hu); TestDouble(1 / 16.0, "0.0625", c9hu); TestDouble(1 / 32.0, "0.03125", c9hu); TestDouble(1 / 64.0, "0.015625", c9hu); TestDouble(1 / 128.0, "0.0078125", c9hu); TestDouble(1 / 256.0, "0.00390625", c9hu); TestDouble(1 / 512.0, "0.001953125", c9hu); TestDouble(1 / 1024.0, "0.0009765625", c9hu); TestDouble(1 / 2048.0, "0.00048828125", c9hu); TestDouble(1 / 4096.0, "0.000244140625", c9hu); TestDouble(1 / 8192.0, "0.000122070313", c9hu); TestDouble(1 / 16384.0, "0.0000610351563", c9hu); TestDouble(1 / (1024.0 * 1024), "9.53674316E-7", c9hu); // random goodness TestDouble(1.23456789, "1.23456789", c9hu); TestDouble(1.234567896, "1.23456790", c9hu); TestDouble(1.234567891, "1.23456789", c9hu); TestDouble(12.34567891, "12.3456789", c9hu); TestDouble(123.4567891, "123.456789", c9hu); TestDouble(1234.567891, "1234.56789", c9hu); TestDouble(12345.67891, "12345.6789", c9hu); TestDouble(123456.7891, "123456.789", c9hu); TestDouble(1234567.891, "1234567.89", c9hu); TestDouble(12345678.91, "12345678.9", c9hu); TestDouble(123456789.1, "123456789", c9hu); TestDouble(1234567891.0, "1.23456789E+9", c9hu); TestDouble(12345678910.0, "1.23456789E+10", c9hu); TestDouble(123456789100.00, "1.23456789E+11", c9hu); TestDouble(1.234567896, "1.23456790", c9hu); TestDouble(12.34567896, "12.3456790", c9hu); TestDouble(123.4567896, "123.456790", c9hu); TestDouble(1234.567896, "1234.56790", c9hu); TestDouble(12345.67896, "12345.6790", c9hu); TestDouble(123456.7896, "123456.790", c9hu); TestDouble(1234567.896, "1234567.90", c9hu); TestDouble(12345678.96, "12345679.0", c9hu); TestDouble(123456789.6, "123456790", c9hu); TestDouble(1234567896.0, "1.23456790E+9", c9hu); TestDouble(12345678960.0, "1.23456790E+10", c9hu); TestDouble(123456789600.00, "1.23456790E+11", c9hu); TestDouble(0.1234567891, "0.123456789", c9hu); TestDouble(0.01234567891, "0.0123456789", c9hu); TestDouble(0.001234567891, "0.00123456789", c9hu); TestDouble(0.0001234567891, "0.000123456789", c9hu); TestDouble(0.00001234567891, "0.0000123456789", c9hu); TestDouble(0.000001234567891, "0.00000123456789", c9hu); TestDouble(0.0000001234567891, "1.23456789E-7", c9hu); TestDouble(0.00000001234567891, "1.23456789E-8", c9hu); TestDouble(0.000000001234567891, "1.23456789E-9", c9hu); TestDouble(0.0000000001234567891, "1.23456789E-10", c9hu); TestDouble(0.00000000001234567891, "1.23456789E-11", c9hu); TestDouble(0.000000000001234567891, "1.23456789E-12", c9hu); TestDouble(0.0000000000001234567891, "1.23456789E-13", c9hu); TestDouble(0.1234567896, "0.123456790", c9hu); TestDouble(0.01234567896, "0.0123456790", c9hu); TestDouble(0.001234567896, "0.00123456790", c9hu); TestDouble(0.0001234567896, "0.000123456790", c9hu); TestDouble(0.00001234567896, "0.0000123456790", c9hu); TestDouble(0.000001234567896, "0.00000123456790", c9hu); TestDouble(0.0000001234567896, "1.23456790E-7", c9hu); TestDouble(0.00000001234567896, "1.23456790E-8", c9hu); TestDouble(0.000000001234567896, "1.23456790E-9", c9hu); TestDouble(0.0000000001234567896, "1.23456790E-10", c9hu); TestDouble(0.00000000001234567896, "1.23456790E-11", c9hu); TestDouble(0.000000000001234567896, "1.23456790E-12", c9hu); TestDouble(0.0000000000001234567896, "1.23456790E-13", c9hu); }
public void SpecAdd() { BigDecimal.Context c6hu = new BigDecimal.Context(6, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c9hu = new BigDecimal.Context(9, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c15hu = new BigDecimal.Context(15, BigDecimal.RoundingMode.HalfUp); //-- [first group are 'quick confidence check'] TAdd("addx001 add 1 1 -> 2", c9hu); TAdd("addx002 add 2 3 -> 5", c9hu); TAdd("addx003 add '5.75' '3.3' -> 9.05", c9hu); TAdd("addx004 add '5' '-3' -> 2", c9hu); TAdd("addx005 add '-5' '-3' -> -8", c9hu); TAdd("addx006 add '-7' '2.5' -> -4.5", c9hu); TAdd("addx007 add '0.7' '0.3' -> 1.0", c9hu); TAdd("addx008 add '1.25' '1.25' -> 2.50", c9hu); TAdd("addx009 add '1.23456789' '1.00000000' -> '2.23456789'", c9hu); TAdd("addx010 add '1.23456789' '1.00000011' -> '2.23456800'", c9hu); TAdd("addx011 add '0.4444444444' '0.5555555555' -> '1.00000000' Inexact Rounded", c9hu); TAdd("addx012 add '0.4444444440' '0.5555555555' -> '1.00000000' Inexact Rounded", c9hu); TAdd("addx013 add '0.4444444444' '0.5555555550' -> '0.999999999' Inexact Rounded", c9hu); TAdd("addx014 add '0.44444444449' '0' -> '0.444444444' Inexact Rounded", c9hu); TAdd("addx015 add '0.444444444499' '0' -> '0.444444444' Inexact Rounded", c9hu); TAdd("addx016 add '0.4444444444999' '0' -> '0.444444444' Inexact Rounded", c9hu); TAdd("addx017 add '0.4444444445000' '0' -> '0.444444445' Inexact Rounded", c9hu); TAdd("addx018 add '0.4444444445001' '0' -> '0.444444445' Inexact Rounded", c9hu); TAdd("addx019 add '0.444444444501' '0' -> '0.444444445' Inexact Rounded", c9hu); TAdd("addx020 add '0.44444444451' '0' -> '0.444444445' Inexact Rounded", c9hu); TAdd("addx021 add 0 1 -> 1", c9hu); TAdd("addx022 add 1 1 -> 2", c9hu); TAdd("addx023 add 2 1 -> 3", c9hu); TAdd("addx024 add 3 1 -> 4", c9hu); TAdd("addx025 add 4 1 -> 5", c9hu); TAdd("addx026 add 5 1 -> 6", c9hu); TAdd("addx027 add 6 1 -> 7", c9hu); TAdd("addx028 add 7 1 -> 8", c9hu); TAdd("addx029 add 8 1 -> 9", c9hu); TAdd("addx030 add 9 1 -> 10", c9hu); //-- some carrying effects TAdd("addx031 add '0.9998' '0.0000' -> '0.9998'", c9hu); TAdd("addx032 add '0.9998' '0.0001' -> '0.9999'", c9hu); TAdd("addx033 add '0.9998' '0.0002' -> '1.0000'", c9hu); TAdd("addx034 add '0.9998' '0.0003' -> '1.0001'", c9hu); TAdd("addx035 add '70' '10000e+9' -> '1.00000000E+13' Inexact Rounded", c9hu); TAdd("addx036 add '700' '10000e+9' -> '1.00000000E+13' Inexact Rounded", c9hu); TAdd("addx037 add '7000' '10000e+9' -> '1.00000000E+13' Inexact Rounded", c9hu); TAdd("addx038 add '70000' '10000e+9' -> '1.00000001E+13' Inexact Rounded", c9hu); TAdd("addx039 add '700000' '10000e+9' -> '1.00000007E+13' Rounded", c9hu); // -- symmetry: TAdd("addx040 add '10000e+9' '70' -> '1.00000000E+13' Inexact Rounded", c9hu); TAdd("addx041 add '10000e+9' '700' -> '1.00000000E+13' Inexact Rounded", c9hu); TAdd("addx042 add '10000e+9' '7000' -> '1.00000000E+13' Inexact Rounded", c9hu); TAdd("addx044 add '10000e+9' '70000' -> '1.00000001E+13' Inexact Rounded", c9hu); TAdd("addx045 add '10000e+9' '700000' -> '1.00000007E+13' Rounded", c9hu); //-- same, higher precision //precision: 15 TAdd("addx046 add '10000e+9' '7' -> '10000000000007'", c15hu); TAdd("addx047 add '10000e+9' '70' -> '10000000000070'", c15hu); TAdd("addx048 add '10000e+9' '700' -> '10000000000700'", c15hu); TAdd("addx049 add '10000e+9' '7000' -> '10000000007000'", c15hu); TAdd("addx050 add '10000e+9' '70000' -> '10000000070000'", c15hu); TAdd("addx051 add '10000e+9' '700000' -> '10000000700000'", c15hu); TAdd("addx052 add '10000e+9' '7000000' -> '10000007000000'", c15hu); // -- examples from decarith TAdd("addx053 add '12' '7.00' -> '19.00'", c9hu); TAdd("addx054 add '1.3' '-1.07' -> '0.23'", c9hu); TAdd("addx055 add '1.3' '-1.30' -> '0.00'", c9hu); TAdd("addx056 add '1.3' '-2.07' -> '-0.77'", c9hu); TAdd("addx057 add '1E+2' '1E+4' -> '1.01E+4'", c9hu); // -- zero preservation // precision: 6 TAdd("addx060 add '10000e+9' '70000' -> '1.00000E+13' Inexact Rounded", c6hu); TAdd("addx061 add 1 '0.0001' -> '1.0001'", c6hu); TAdd("addx062 add 1 '0.00001' -> '1.00001'", c6hu); TAdd("addx063 add 1 '0.000001' -> '1.00000' Inexact Rounded", c6hu); TAdd("addx064 add 1 '0.0000001' -> '1.00000' Inexact Rounded", c6hu); TAdd("addx065 add 1 '0.00000001' -> '1.00000' Inexact Rounded", c6hu); // -- some funny zeros [in case of bad signum] TAdd("addx070 add 1 0 -> 1", c6hu); TAdd("addx071 add 1 0. -> 1", c6hu); TAdd("addx072 add 1 .0 -> 1.0", c6hu); TAdd("addx073 add 1 0.0 -> 1.0", c6hu); TAdd("addx074 add 1 0.00 -> 1.00", c6hu); TAdd("addx075 add 0 1 -> 1", c6hu); TAdd("addx076 add 0. 1 -> 1", c6hu); TAdd("addx077 add .0 1 -> 1.0", c6hu); TAdd("addx078 add 0.0 1 -> 1.0", c6hu); TAdd("addx079 add 0.00 1 -> 1.00", c6hu); // precision: 9 // -- some carries TAdd("addx080 add 999999998 1 -> 999999999", c9hu); TAdd("addx081 add 999999999 1 -> 1.00000000E+9 Rounded", c9hu); TAdd("addx082 add 99999999 1 -> 100000000", c9hu); TAdd("addx083 add 9999999 1 -> 10000000", c9hu); TAdd("addx084 add 999999 1 -> 1000000", c9hu); TAdd("addx085 add 99999 1 -> 100000", c9hu); TAdd("addx086 add 9999 1 -> 10000", c9hu); TAdd("addx087 add 999 1 -> 1000", c9hu); TAdd("addx088 add 99 1 -> 100", c9hu); TAdd("addx089 add 9 1 -> 10", c9hu); //-- more LHS swaps TAdd("addx090 add '-56267E-10' 0 -> '-0.0000056267'", c9hu); TAdd("addx091 add '-56267E-6' 0 -> '-0.056267'", c9hu); TAdd("addx092 add '-56267E-5' 0 -> '-0.56267'", c9hu); TAdd("addx093 add '-56267E-4' 0 -> '-5.6267'", c9hu); TAdd("addx094 add '-56267E-3' 0 -> '-56.267'", c9hu); TAdd("addx095 add '-56267E-2' 0 -> '-562.67'", c9hu); TAdd("addx096 add '-56267E-1' 0 -> '-5626.7'", c9hu); TAdd("addx097 add '-56267E-0' 0 -> '-56267'", c9hu); TAdd("addx098 add '-5E-10' 0 -> '-5E-10'", c9hu); TAdd("addx099 add '-5E-7' 0 -> '-5E-7'", c9hu); TAdd("addx100 add '-5E-6' 0 -> '-0.000005'", c9hu); TAdd("addx101 add '-5E-5' 0 -> '-0.00005'", c9hu); TAdd("addx102 add '-5E-4' 0 -> '-0.0005'", c9hu); TAdd("addx103 add '-5E-1' 0 -> '-0.5'", c9hu); TAdd("addx104 add '-5E0' 0 -> '-5'", c9hu); TAdd("addx105 add '-5E1' 0 -> '-50'", c9hu); TAdd("addx106 add '-5E5' 0 -> '-500000'", c9hu); TAdd("addx107 add '-5E8' 0 -> '-500000000'", c9hu); TAdd("addx108 add '-5E9' 0 -> '-5.00000000E+9' Rounded", c9hu); TAdd("addx109 add '-5E10' 0 -> '-5.00000000E+10' Rounded", c9hu); TAdd("addx110 add '-5E11' 0 -> '-5.00000000E+11' Rounded", c9hu); TAdd("addx111 add '-5E100' 0 -> '-5.00000000E+100' Rounded", c9hu); // -- more RHS swaps TAdd("addx113 add 0 '-56267E-10' -> '-0.0000056267'", c9hu); TAdd("addx114 add 0 '-56267E-6' -> '-0.056267'", c9hu); TAdd("addx116 add 0 '-56267E-5' -> '-0.56267'", c9hu); TAdd("addx117 add 0 '-56267E-4' -> '-5.6267'", c9hu); TAdd("addx119 add 0 '-56267E-3' -> '-56.267'", c9hu); TAdd("addx120 add 0 '-56267E-2' -> '-562.67'", c9hu); TAdd("addx121 add 0 '-56267E-1' -> '-5626.7'", c9hu); TAdd("addx122 add 0 '-56267E-0' -> '-56267'", c9hu); TAdd("addx123 add 0 '-5E-10' -> '-5E-10'", c9hu); TAdd("addx124 add 0 '-5E-7' -> '-5E-7'", c9hu); TAdd("addx125 add 0 '-5E-6' -> '-0.000005'", c9hu); TAdd("addx126 add 0 '-5E-5' -> '-0.00005'", c9hu); TAdd("addx127 add 0 '-5E-4' -> '-0.0005'", c9hu); TAdd("addx128 add 0 '-5E-1' -> '-0.5'", c9hu); TAdd("addx129 add 0 '-5E0' -> '-5'", c9hu); TAdd("addx130 add 0 '-5E1' -> '-50'", c9hu); TAdd("addx131 add 0 '-5E5' -> '-500000'", c9hu); TAdd("addx132 add 0 '-5E8' -> '-500000000'", c9hu); TAdd("addx133 add 0 '-5E9' -> '-5.00000000E+9' Rounded", c9hu); TAdd("addx134 add 0 '-5E10' -> '-5.00000000E+10' Rounded", c9hu); TAdd("addx135 add 0 '-5E11' -> '-5.00000000E+11' Rounded", c9hu); TAdd("addx136 add 0 '-5E100' -> '-5.00000000E+100' Rounded", c9hu); //-- related TAdd("addx137 add 1 '0E-12' -> '1.00000000' Rounded", c9hu); TAdd("addx138 add -1 '0E-12' -> '-1.00000000' Rounded", c9hu); TAdd("addx139 add '0E-12' 1 -> '1.00000000' Rounded", c9hu); TAdd("addx140 add '0E-12' -1 -> '-1.00000000' Rounded", c9hu); TAdd("addx141 add 1E+4 0.0000 -> '10000.0000'", c9hu); TAdd("addx142 add 1E+4 0.00000 -> '10000.0000' Rounded", c9hu); TAdd("addx143 add 0.000 1E+5 -> '100000.000'", c9hu); TAdd("addx144 add 0.0000 1E+5 -> '100000.000' Rounded", c9hu); // -- [some of the next group are really constructor tests] TAdd("addx146 add '00.0' 0 -> '0.0'", c9hu); TAdd("addx147 add '0.00' 0 -> '0.00'", c9hu); TAdd("addx148 add 0 '0.00' -> '0.00'", c9hu); TAdd("addx149 add 0 '00.0' -> '0.0'", c9hu); TAdd("addx150 add '00.0' '0.00' -> '0.00'", c9hu); TAdd("addx151 add '0.00' '00.0' -> '0.00'", c9hu); TAdd("addx152 add '3' '.3' -> '3.3'", c9hu); TAdd("addx153 add '3.' '.3' -> '3.3'", c9hu); TAdd("addx154 add '3.0' '.3' -> '3.3'", c9hu); TAdd("addx155 add '3.00' '.3' -> '3.30'", c9hu); TAdd("addx156 add '3' '3' -> '6'", c9hu); TAdd("addx157 add '3' '+3' -> '6'", c9hu); TAdd("addx158 add '3' '-3' -> '0'", c9hu); TAdd("addx159 add '0.3' '-0.3' -> '0.0'", c9hu); TAdd("addx160 add '0.03' '-0.03' -> '0.00'", c9hu); // -- try borderline precision, with carries, etc. // precision: 15 TAdd("addx161 add '1E+12' '-1' -> '999999999999'", c15hu); TAdd("addx162 add '1E+12' '1.11' -> '1000000000001.11'", c15hu); TAdd("addx163 add '1.11' '1E+12' -> '1000000000001.11'", c15hu); TAdd("addx164 add '-1' '1E+12' -> '999999999999'", c15hu); TAdd("addx165 add '7E+12' '-1' -> '6999999999999'", c15hu); TAdd("addx166 add '7E+12' '1.11' -> '7000000000001.11'", c15hu); TAdd("addx167 add '1.11' '7E+12' -> '7000000000001.11'", c15hu); TAdd("addx168 add '-1' '7E+12' -> '6999999999999'", c15hu); //-- 123456789012345 123456789012345 1 23456789012345 TAdd("addx170 add '0.444444444444444' '0.555555555555563' -> '1.00000000000001' Inexact Rounded", c15hu); TAdd("addx171 add '0.444444444444444' '0.555555555555562' -> '1.00000000000001' Inexact Rounded", c15hu); TAdd("addx172 add '0.444444444444444' '0.555555555555561' -> '1.00000000000001' Inexact Rounded", c15hu); TAdd("addx173 add '0.444444444444444' '0.555555555555560' -> '1.00000000000000' Inexact Rounded", c15hu); TAdd("addx174 add '0.444444444444444' '0.555555555555559' -> '1.00000000000000' Inexact Rounded", c15hu); TAdd("addx175 add '0.444444444444444' '0.555555555555558' -> '1.00000000000000' Inexact Rounded", c15hu); TAdd("addx176 add '0.444444444444444' '0.555555555555557' -> '1.00000000000000' Inexact Rounded", c15hu); TAdd("addx177 add '0.444444444444444' '0.555555555555556' -> '1.00000000000000' Rounded", c15hu); TAdd("addx178 add '0.444444444444444' '0.555555555555555' -> '0.999999999999999'", c15hu); TAdd("addx179 add '0.444444444444444' '0.555555555555554' -> '0.999999999999998'", c15hu); TAdd("addx180 add '0.444444444444444' '0.555555555555553' -> '0.999999999999997'", c15hu); TAdd("addx181 add '0.444444444444444' '0.555555555555552' -> '0.999999999999996'", c15hu); TAdd("addx182 add '0.444444444444444' '0.555555555555551' -> '0.999999999999995'", c15hu); TAdd("addx183 add '0.444444444444444' '0.555555555555550' -> '0.999999999999994'", c15hu); // -- and some more, including residue effects and different roundings // precision: 9 // rounding: half_up TAdd("addx200 add '123456789' 0 -> '123456789'", c9hu); TAdd("addx201 add '123456789' 0.000000001 -> '123456789' Inexact Rounded", c9hu); TAdd("addx202 add '123456789' 0.000001 -> '123456789' Inexact Rounded", c9hu); TAdd("addx203 add '123456789' 0.1 -> '123456789' Inexact Rounded", c9hu); TAdd("addx204 add '123456789' 0.4 -> '123456789' Inexact Rounded", c9hu); TAdd("addx205 add '123456789' 0.49 -> '123456789' Inexact Rounded", c9hu); TAdd("addx206 add '123456789' 0.499999 -> '123456789' Inexact Rounded", c9hu); TAdd("addx207 add '123456789' 0.499999999 -> '123456789' Inexact Rounded", c9hu); TAdd("addx208 add '123456789' 0.5 -> '123456790' Inexact Rounded", c9hu); TAdd("addx209 add '123456789' 0.500000001 -> '123456790' Inexact Rounded", c9hu); TAdd("addx210 add '123456789' 0.500001 -> '123456790' Inexact Rounded", c9hu); TAdd("addx211 add '123456789' 0.51 -> '123456790' Inexact Rounded", c9hu); TAdd("addx212 add '123456789' 0.6 -> '123456790' Inexact Rounded", c9hu); TAdd("addx213 add '123456789' 0.9 -> '123456790' Inexact Rounded", c9hu); TAdd("addx214 add '123456789' 0.99999 -> '123456790' Inexact Rounded", c9hu); TAdd("addx215 add '123456789' 0.999999999 -> '123456790' Inexact Rounded", c9hu); TAdd("addx216 add '123456789' 1 -> '123456790'", c9hu); TAdd("addx217 add '123456789' 1.000000001 -> '123456790' Inexact Rounded", c9hu); TAdd("addx218 add '123456789' 1.00001 -> '123456790' Inexact Rounded", c9hu); TAdd("addx219 add '123456789' 1.1 -> '123456790' Inexact Rounded", c9hu); BigDecimal.Context c9he = new BigDecimal.Context(9, BigDecimal.RoundingMode.HalfEven); // rounding: half_even TAdd("addx220 add '123456789' 0 -> '123456789'", c9he); TAdd("addx221 add '123456789' 0.000000001 -> '123456789' Inexact Rounded", c9he); TAdd("addx222 add '123456789' 0.000001 -> '123456789' Inexact Rounded", c9he); TAdd("addx223 add '123456789' 0.1 -> '123456789' Inexact Rounded", c9he); TAdd("addx224 add '123456789' 0.4 -> '123456789' Inexact Rounded", c9he); TAdd("addx225 add '123456789' 0.49 -> '123456789' Inexact Rounded", c9he); TAdd("addx226 add '123456789' 0.499999 -> '123456789' Inexact Rounded", c9he); TAdd("addx227 add '123456789' 0.499999999 -> '123456789' Inexact Rounded", c9he); TAdd("addx228 add '123456789' 0.5 -> '123456790' Inexact Rounded", c9he); TAdd("addx229 add '123456789' 0.500000001 -> '123456790' Inexact Rounded", c9he); TAdd("addx230 add '123456789' 0.500001 -> '123456790' Inexact Rounded", c9he); TAdd("addx231 add '123456789' 0.51 -> '123456790' Inexact Rounded", c9he); TAdd("addx232 add '123456789' 0.6 -> '123456790' Inexact Rounded", c9he); TAdd("addx233 add '123456789' 0.9 -> '123456790' Inexact Rounded", c9he); TAdd("addx234 add '123456789' 0.99999 -> '123456790' Inexact Rounded", c9he); TAdd("addx235 add '123456789' 0.999999999 -> '123456790' Inexact Rounded", c9he); TAdd("addx236 add '123456789' 1 -> '123456790'", c9he); TAdd("addx237 add '123456789' 1.00000001 -> '123456790' Inexact Rounded", c9he); TAdd("addx238 add '123456789' 1.00001 -> '123456790' Inexact Rounded", c9he); TAdd("addx239 add '123456789' 1.1 -> '123456790' Inexact Rounded", c9he); //-- critical few with even bottom digit... TAdd("addx240 add '123456788' 0.499999999 -> '123456788' Inexact Rounded", c9he); TAdd("addx241 add '123456788' 0.5 -> '123456788' Inexact Rounded", c9he); TAdd("addx242 add '123456788' 0.500000001 -> '123456789' Inexact Rounded", c9he); BigDecimal.Context c9d = new BigDecimal.Context(9, BigDecimal.RoundingMode.Down); // rounding: down TAdd("addx250 add '123456789' 0 -> '123456789'", c9d); TAdd("addx251 add '123456789' 0.000000001 -> '123456789' Inexact Rounded", c9d); TAdd("addx252 add '123456789' 0.000001 -> '123456789' Inexact Rounded", c9d); TAdd("addx253 add '123456789' 0.1 -> '123456789' Inexact Rounded", c9d); TAdd("addx254 add '123456789' 0.4 -> '123456789' Inexact Rounded", c9d); TAdd("addx255 add '123456789' 0.49 -> '123456789' Inexact Rounded", c9d); TAdd("addx256 add '123456789' 0.499999 -> '123456789' Inexact Rounded", c9d); TAdd("addx257 add '123456789' 0.499999999 -> '123456789' Inexact Rounded", c9d); TAdd("addx258 add '123456789' 0.5 -> '123456789' Inexact Rounded", c9d); TAdd("addx259 add '123456789' 0.500000001 -> '123456789' Inexact Rounded", c9d); TAdd("addx260 add '123456789' 0.500001 -> '123456789' Inexact Rounded", c9d); TAdd("addx261 add '123456789' 0.51 -> '123456789' Inexact Rounded", c9d); TAdd("addx262 add '123456789' 0.6 -> '123456789' Inexact Rounded", c9d); TAdd("addx263 add '123456789' 0.9 -> '123456789' Inexact Rounded", c9d); TAdd("addx264 add '123456789' 0.99999 -> '123456789' Inexact Rounded", c9d); TAdd("addx265 add '123456789' 0.999999999 -> '123456789' Inexact Rounded", c9d); TAdd("addx266 add '123456789' 1 -> '123456790'", c9d); TAdd("addx267 add '123456789' 1.00000001 -> '123456790' Inexact Rounded", c9d); TAdd("addx268 add '123456789' 1.00001 -> '123456790' Inexact Rounded", c9d); TAdd("addx269 add '123456789' 1.1 -> '123456790' Inexact Rounded", c9d); //-- input preparation tests (operands should not be rounded) //precision: 3 //rounding: half_up BigDecimal.Context c3hu = new BigDecimal.Context(3, BigDecimal.RoundingMode.HalfUp); TAdd("addx270 add '12345678900000' 9999999999999 -> '2.23E+13' Inexact Rounded", c3hu); TAdd("addx271 add '9999999999999' 12345678900000 -> '2.23E+13' Inexact Rounded", c3hu); TAdd("addx272 add '12E+3' '3444' -> '1.54E+4' Inexact Rounded", c3hu); TAdd("addx273 add '12E+3' '3446' -> '1.54E+4' Inexact Rounded", c3hu); TAdd("addx274 add '12E+3' '3449.9' -> '1.54E+4' Inexact Rounded", c3hu); TAdd("addx275 add '12E+3' '3450.0' -> '1.55E+4' Inexact Rounded", c3hu); TAdd("addx276 add '12E+3' '3450.1' -> '1.55E+4' Inexact Rounded", c3hu); TAdd("addx277 add '12E+3' '3454' -> '1.55E+4' Inexact Rounded", c3hu); TAdd("addx278 add '12E+3' '3456' -> '1.55E+4' Inexact Rounded", c3hu); TAdd("addx281 add '3444' '12E+3' -> '1.54E+4' Inexact Rounded", c3hu); TAdd("addx282 add '3446' '12E+3' -> '1.54E+4' Inexact Rounded", c3hu); TAdd("addx283 add '3449.9' '12E+3' -> '1.54E+4' Inexact Rounded", c3hu); TAdd("addx284 add '3450.0' '12E+3' -> '1.55E+4' Inexact Rounded", c3hu); TAdd("addx285 add '3450.1' '12E+3' -> '1.55E+4' Inexact Rounded", c3hu); TAdd("addx286 add '3454' '12E+3' -> '1.55E+4' Inexact Rounded", c3hu); TAdd("addx287 add '3456' '12E+3' -> '1.55E+4' Inexact Rounded", c3hu); //rounding: half_down BigDecimal.Context c3hd = new BigDecimal.Context(3, BigDecimal.RoundingMode.HalfDown); TAdd("addx291 add '3444' '12E+3' -> '1.54E+4' Inexact Rounded", c3hd); TAdd("addx292 add '3446' '12E+3' -> '1.54E+4' Inexact Rounded", c3hd); TAdd("addx293 add '3449.9' '12E+3' -> '1.54E+4' Inexact Rounded", c3hd); TAdd("addx294 add '3450.0' '12E+3' -> '1.54E+4' Inexact Rounded", c3hd); TAdd("addx295 add '3450.1' '12E+3' -> '1.55E+4' Inexact Rounded", c3hd); TAdd("addx296 add '3454' '12E+3' -> '1.55E+4' Inexact Rounded", c3hd); TAdd("addx297 add '3456' '12E+3' -> '1.55E+4' Inexact Rounded", c3hd); // -- 1 in last place tests // rounding: half_up TAdd("addx301 add -1 1 -> 0", c3hu); TAdd("addx302 add 0 1 -> 1", c3hu); TAdd("addx303 add 1 1 -> 2", c3hu); TAdd("addx304 add 12 1 -> 13", c3hu); TAdd("addx305 add 98 1 -> 99", c3hu); TAdd("addx306 add 99 1 -> 100", c3hu); TAdd("addx307 add 100 1 -> 101", c3hu); TAdd("addx308 add 101 1 -> 102", c3hu); TAdd("addx309 add -1 -1 -> -2", c3hu); TAdd("addx310 add 0 -1 -> -1", c3hu); TAdd("addx311 add 1 -1 -> 0", c3hu); TAdd("addx312 add 12 -1 -> 11", c3hu); TAdd("addx313 add 98 -1 -> 97", c3hu); TAdd("addx314 add 99 -1 -> 98", c3hu); TAdd("addx315 add 100 -1 -> 99", c3hu); TAdd("addx316 add 101 -1 -> 100", c3hu); TAdd("addx321 add -0.01 0.01 -> 0.00", c3hu); TAdd("addx322 add 0.00 0.01 -> 0.01", c3hu); TAdd("addx323 add 0.01 0.01 -> 0.02", c3hu); TAdd("addx324 add 0.12 0.01 -> 0.13", c3hu); TAdd("addx325 add 0.98 0.01 -> 0.99", c3hu); TAdd("addx326 add 0.99 0.01 -> 1.00", c3hu); TAdd("addx327 add 1.00 0.01 -> 1.01", c3hu); TAdd("addx328 add 1.01 0.01 -> 1.02", c3hu); TAdd("addx329 add -0.01 -0.01 -> -0.02", c3hu); TAdd("addx330 add 0.00 -0.01 -> -0.01", c3hu); TAdd("addx331 add 0.01 -0.01 -> 0.00", c3hu); TAdd("addx332 add 0.12 -0.01 -> 0.11", c3hu); TAdd("addx333 add 0.98 -0.01 -> 0.97", c3hu); TAdd("addx334 add 0.99 -0.01 -> 0.98", c3hu); TAdd("addx335 add 1.00 -0.01 -> 0.99", c3hu); TAdd("addx336 add 1.01 -0.01 -> 1.00", c3hu); // -- some more cases where adding 0 affects the coefficient // precision: 9 TAdd("addx340 add 1E+3 0 -> 1000", c9hu); TAdd("addx341 add 1E+8 0 -> 100000000", c9hu); TAdd("addx342 add 1E+9 0 -> 1.00000000E+9 Rounded", c9hu); TAdd("addx343 add 1E+10 0 -> 1.00000000E+10 Rounded", c9hu); // -- which simply follow from these cases ... TAdd("addx344 add 1E+3 1 -> 1001", c9hu); TAdd("addx345 add 1E+8 1 -> 100000001", c9hu); TAdd("addx346 add 1E+9 1 -> 1.00000000E+9 Inexact Rounded", c9hu); TAdd("addx347 add 1E+10 1 -> 1.00000000E+10 Inexact Rounded", c9hu); TAdd("addx348 add 1E+3 7 -> 1007", c9hu); TAdd("addx349 add 1E+8 7 -> 100000007", c9hu); TAdd("addx350 add 1E+9 7 -> 1.00000001E+9 Inexact Rounded", c9hu); TAdd("addx351 add 1E+10 7 -> 1.00000000E+10 Inexact Rounded", c9hu); // -- tryzeros cases // precision: 7 // rounding: half_up // maxExponent: 92 // minexponent: -92 BigDecimal.Context c6hd = new BigDecimal.Context(6, BigDecimal.RoundingMode.HalfDown); BigDecimal.Context c6he = new BigDecimal.Context(6, BigDecimal.RoundingMode.HalfEven); BigDecimal.Context c7hu = new BigDecimal.Context(7, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c10hd = new BigDecimal.Context(10, BigDecimal.RoundingMode.HalfDown); BigDecimal.Context c10hu = new BigDecimal.Context(10, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c10he = new BigDecimal.Context(10, BigDecimal.RoundingMode.HalfEven); TAdd("addx361 add 0E+50 10000E+1 -> 1.0000E+5", c7hu); TAdd("addx362 add 10000E+1 0E-50 -> 100000.0 Rounded", c7hu); TAdd("addx363 add 10000E+1 10000E-50 -> 100000.0 Rounded Inexact", c7hu); TAdd("addx364 add 9.999999E+92 -9.999999E+92 -> 0E+86", c7hu); // -- a curiosity from JSR 13 testing // rounding: half_down // precision: 10 TAdd("addx370 add 99999999 81512 -> 100081511", c10hd); // precision: 6 TAdd("addx371 add 99999999 81512 -> 1.00082E+8 Rounded Inexact", c6hd); // rounding: half_up // precision: 10 TAdd("addx372 add 99999999 81512 -> 100081511", c10hu); // precision: 6 TAdd("addx373 add 99999999 81512 -> 1.00082E+8 Rounded Inexact", c6hu); // rounding: half_even // precision: 10 TAdd("addx374 add 99999999 81512 -> 100081511", c10he); // precision: 6 TAdd("addx375 add 99999999 81512 -> 1.00082E+8 Rounded Inexact", c6he); // -- ulp replacement tests // precision: 9 // maxexponent: 999999999 // minexponent: -999999999 TAdd("addx400 add 1 77e-7 -> 1.0000077", c9he); TAdd("addx401 add 1 77e-8 -> 1.00000077", c9he); TAdd("addx402 add 1 77e-9 -> 1.00000008 Inexact Rounded", c9he); TAdd("addx403 add 1 77e-10 -> 1.00000001 Inexact Rounded", c9he); TAdd("addx404 add 1 77e-11 -> 1.00000000 Inexact Rounded", c9he); TAdd("addx405 add 1 77e-12 -> 1.00000000 Inexact Rounded", c9he); TAdd("addx406 add 1 77e-999 -> 1.00000000 Inexact Rounded", c9he); //TAdd("addx407 add 1 77e-9999999 -> 1.00000000 Inexact Rounded", c9he); TAdd("addx410 add 10 77e-7 -> 10.0000077", c9he); TAdd("addx411 add 10 77e-8 -> 10.0000008 Inexact Rounded", c9he); TAdd("addx412 add 10 77e-9 -> 10.0000001 Inexact Rounded", c9he); TAdd("addx413 add 10 77e-10 -> 10.0000000 Inexact Rounded", c9he); TAdd("addx414 add 10 77e-11 -> 10.0000000 Inexact Rounded", c9he); TAdd("addx415 add 10 77e-12 -> 10.0000000 Inexact Rounded", c9he); TAdd("addx416 add 10 77e-999 -> 10.0000000 Inexact Rounded", c9he); //TAdd("addx417 add 10 77e-9999999 -> 10.0000000 Inexact Rounded", c9he); TAdd("addx420 add 77e-7 1 -> 1.0000077", c9he); TAdd("addx421 add 77e-8 1 -> 1.00000077", c9he); TAdd("addx422 add 77e-9 1 -> 1.00000008 Inexact Rounded", c9he); TAdd("addx423 add 77e-10 1 -> 1.00000001 Inexact Rounded", c9he); TAdd("addx424 add 77e-11 1 -> 1.00000000 Inexact Rounded", c9he); TAdd("addx425 add 77e-12 1 -> 1.00000000 Inexact Rounded", c9he); TAdd("addx426 add 77e-999 1 -> 1.00000000 Inexact Rounded", c9he); //TAdd("addx427 add 77e-9999999 1 -> 1.00000000 Inexact Rounded", c9he); TAdd("addx430 add 77e-7 10 -> 10.0000077", c9he); TAdd("addx431 add 77e-8 10 -> 10.0000008 Inexact Rounded", c9he); TAdd("addx432 add 77e-9 10 -> 10.0000001 Inexact Rounded", c9he); TAdd("addx433 add 77e-10 10 -> 10.0000000 Inexact Rounded", c9he); TAdd("addx434 add 77e-11 10 -> 10.0000000 Inexact Rounded", c9he); TAdd("addx435 add 77e-12 10 -> 10.0000000 Inexact Rounded", c9he); TAdd("addx436 add 77e-999 10 -> 10.0000000 Inexact Rounded", c9he); //TAdd("addx437 add 77e-9999999 10 -> 10.0000000 Inexact Rounded", c9he); // -- negative ulps TAdd("addx440 add 1 -77e-7 -> 0.9999923", c9he); TAdd("addx441 add 1 -77e-8 -> 0.99999923", c9he); TAdd("addx442 add 1 -77e-9 -> 0.999999923", c9he); TAdd("addx443 add 1 -77e-10 -> 0.999999992 Inexact Rounded", c9he); TAdd("addx444 add 1 -77e-11 -> 0.999999999 Inexact Rounded", c9he); TAdd("addx445 add 1 -77e-12 -> 1.00000000 Inexact Rounded", c9he); TAdd("addx446 add 1 -77e-999 -> 1.00000000 Inexact Rounded", c9he); //TAdd("addx447 add 1 -77e-9999999 -> 1.00000000 Inexact Rounded", c9he); TAdd("addx450 add 10 -77e-7 -> 9.9999923", c9he); TAdd("addx451 add 10 -77e-8 -> 9.99999923", c9he); TAdd("addx452 add 10 -77e-9 -> 9.99999992 Inexact Rounded", c9he); TAdd("addx453 add 10 -77e-10 -> 9.99999999 Inexact Rounded", c9he); TAdd("addx454 add 10 -77e-11 -> 10.0000000 Inexact Rounded", c9he); TAdd("addx455 add 10 -77e-12 -> 10.0000000 Inexact Rounded", c9he); TAdd("addx456 add 10 -77e-999 -> 10.0000000 Inexact Rounded", c9he); //TAdd("addx457 add 10 -77e-9999999 -> 10.0000000 Inexact Rounded", c9he); TAdd("addx460 add -77e-7 1 -> 0.9999923", c9he); TAdd("addx461 add -77e-8 1 -> 0.99999923", c9he); TAdd("addx462 add -77e-9 1 -> 0.999999923", c9he); TAdd("addx463 add -77e-10 1 -> 0.999999992 Inexact Rounded", c9he); TAdd("addx464 add -77e-11 1 -> 0.999999999 Inexact Rounded", c9he); TAdd("addx465 add -77e-12 1 -> 1.00000000 Inexact Rounded", c9he); TAdd("addx466 add -77e-999 1 -> 1.00000000 Inexact Rounded", c9he); //TAdd("addx467 add -77e-9999999 1 -> 1.00000000 Inexact Rounded", c9he); TAdd("addx470 add -77e-7 10 -> 9.9999923", c9he); TAdd("addx471 add -77e-8 10 -> 9.99999923", c9he); TAdd("addx472 add -77e-9 10 -> 9.99999992 Inexact Rounded", c9he); TAdd("addx473 add -77e-10 10 -> 9.99999999 Inexact Rounded", c9he); TAdd("addx474 add -77e-11 10 -> 10.0000000 Inexact Rounded", c9he); TAdd("addx475 add -77e-12 10 -> 10.0000000 Inexact Rounded", c9he); TAdd("addx476 add -77e-999 10 -> 10.0000000 Inexact Rounded", c9he); //TAdd("addx477 add -77e-9999999 10 -> 10.0000000 Inexact Rounded", c9he); }
public void SpecAbsTests() { BigDecimal.Context c9 = new BigDecimal.Context(9, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c7 = new BigDecimal.Context(7, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c6 = new BigDecimal.Context(6, BigDecimal.RoundingMode.HalfUp); BigDecimal.Context c3 = new BigDecimal.Context(3, BigDecimal.RoundingMode.HalfUp); TAbs("absx001 abs '1' -> '1'", c9); TAbs("absx002 abs '-1' -> '1'", c9); TAbs("absx003 abs '1.00' -> '1.00'", c9); TAbs("absx004 abs '-1.00' -> '1.00'", c9); TAbs("absx005 abs '0' -> '0'", c9); TAbs("absx006 abs '0.00' -> '0.00'", c9); TAbs("absx007 abs '00.0' -> '0.0'", c9); TAbs("absx008 abs '00.00' -> '0.00'", c9); TAbs("absx009 abs '00' -> '0'", c9); TAbs("absx010 abs '-2' -> '2'", c9); TAbs("absx011 abs '2' -> '2'", c9); TAbs("absx012 abs '-2.00' -> '2.00'", c9); TAbs("absx013 abs '2.00' -> '2.00'", c9); TAbs("absx014 abs '-0' -> '0'", c9); TAbs("absx015 abs '-0.00' -> '0.00'", c9); TAbs("absx016 abs '-00.0' -> '0.0'", c9); TAbs("absx017 abs '-00.00' -> '0.00'", c9); TAbs("absx018 abs '-00' -> '0'", c9); TAbs("absx020 abs '-2000000' -> '2000000'", c9); TAbs("absx021 abs '2000000' -> '2000000'", c9); // precision: 7 TAbs("absx022 abs '-2000000' -> '2000000'", c7); TAbs("absx023 abs '2000000' -> '2000000'", c7); // precision: 6 TAbs("absx024 abs '-2000000' -> '2.00000E+6' Rounded", c6); TAbs("absx025 abs '2000000' -> '2.00000E+6' Rounded", c6); // precision: 3 TAbs("absx026 abs '-2000000' -> '2.00E+6' Rounded", c3); TAbs("absx027 abs '2000000' -> '2.00E+6' Rounded", c3); TAbs("absx030 abs '+0.1' -> '0.1'", c3); TAbs("absx031 abs '-0.1' -> '0.1'", c3); TAbs("absx032 abs '+0.01' -> '0.01'", c3); TAbs("absx033 abs '-0.01' -> '0.01'", c3); TAbs("absx034 abs '+0.001' -> '0.001'", c3); TAbs("absx035 abs '-0.001' -> '0.001'", c3); TAbs("absx036 abs '+0.000001' -> '0.000001'", c3); TAbs("absx037 abs '-0.000001' -> '0.000001'", c3); TAbs("absx038 abs '+0.000000000001' -> '1E-12'", c3); TAbs("absx039 abs '-0.000000000001' -> '1E-12'", c3); //-- examples from decArith //precision: 9 TAbs("absx040 abs '2.1' -> '2.1'", c9); TAbs("absx041 abs '-100' -> '100'", c9); TAbs("absx042 abs '101.5' -> '101.5'", c9); TAbs("absx043 abs '-101.5' -> '101.5'", c9); //-- more fixed, potential LHS swaps/overlays if done by subtract 0 //precision: 9 TAbs("absx060 abs '-56267E-10' -> '0.0000056267'", c9); TAbs("absx061 abs '-56267E-5' -> '0.56267'", c9); TAbs("absx062 abs '-56267E-2' -> '562.67'", c9); TAbs("absx063 abs '-56267E-1' -> '5626.7'", c9); TAbs("absx065 abs '-56267E-0' -> '56267'", c9); }
public void PowerTestsFromSpec() { BigDecimal.Context c9he = new BigDecimal.Context(9, BigDecimal.RoundingMode.HalfEven); BigDecimal.Context c10he = new BigDecimal.Context(10, BigDecimal.RoundingMode.HalfEven); BigDecimal.Context c16he = new BigDecimal.Context(16, BigDecimal.RoundingMode.HalfEven); //extended: 1 //precision: 16 //rounding: half_even //maxExponent: 384 //minExponent: -383 //-- base checks. Note 0**0 is an error. //TPow("powx001 power '0' '0' -> NaN Invalid_operation TPow("powx002 power '0' '1' -> '0'", c16he); TPow("powx003 power '0' '2' -> '0'", c16he); TPow("powx004 power '1' '0' -> '1'", c16he); TPow("powx005 power '1' '1' -> '1'", c16he); TPow("powx006 power '1' '2' -> '1'", c16he); TPow("powx010 power '2' '0' -> '1'", c16he); TPow("powx011 power '2' '1' -> '2'", c16he); TPow("powx012 power '2' '2' -> '4'", c16he); TPow("powx013 power '2' '3' -> '8'", c16he); TPow("powx014 power '2' '4' -> '16'", c16he); TPow("powx015 power '2' '5' -> '32'", c16he); TPow("powx016 power '2' '6' -> '64'", c16he); TPow("powx017 power '2' '7' -> '128'", c16he); TPow("powx018 power '2' '8' -> '256'", c16he); TPow("powx019 power '2' '9' -> '512'", c16he); TPow("powx020 power '2' '10' -> '1024'", c16he); TPow("powx021 power '2' '11' -> '2048'", c16he); TPow("powx022 power '2' '12' -> '4096'", c16he); TPow("powx023 power '2' '15' -> '32768'", c16he); TPow("powx024 power '2' '16' -> '65536'", c16he); TPow("powx025 power '2' '31' -> '2147483648'", c16he); //-- NB 0 not stripped in next TPow("powx026 power '2' '32' -> '4294967296'", c16he); //precision: 9 TPow("powx027 power '2' '31' -> '2.14748365E+9' Inexact Rounded", c9he); //-- NB 0 not stripped in next TPow("powx028 power '2' '32' -> '4.29496730E+9' Inexact Rounded", c9he); //precision: 10 TPow("powx029 power '2' '31' -> '2147483648'", c10he); TPow("powx030 power '2' '32' -> '4294967296'", c10he); //precision: 9 TPow("powx031 power '3' '2' -> 9", c9he); TPow("powx032 power '4' '2' -> 16", c9he); TPow("powx033 power '5' '2' -> 25", c9he); TPow("powx034 power '6' '2' -> 36", c9he); TPow("powx035 power '7' '2' -> 49", c9he); TPow("powx036 power '8' '2' -> 64", c9he); TPow("powx037 power '9' '2' -> 81", c9he); TPow("powx038 power '10' '2' -> 100", c9he); TPow("powx039 power '11' '2' -> 121", c9he); TPow("powx040 power '12' '2' -> 144", c9he); TPow("powx041 power '3' '3' -> 27", c9he); TPow("powx042 power '4' '3' -> 64", c9he); TPow("powx043 power '5' '3' -> 125", c9he); TPow("powx044 power '6' '3' -> 216", c9he); TPow("powx045 power '7' '3' -> 343", c9he); TPow("powx047 power '-3' '3' -> -27", c9he); TPow("powx048 power '-4' '3' -> -64", c9he); TPow("powx049 power '-5' '3' -> -125", c9he); TPow("powx050 power '-6' '3' -> -216", c9he); TPow("powx051 power '-7' '3' -> -343", c9he); TPow("powx052 power '10' '0' -> 1", c9he); TPow("powx053 power '10' '1' -> 10", c9he); TPow("powx054 power '10' '2' -> 100", c9he); TPow("powx055 power '10' '3' -> 1000", c9he); TPow("powx056 power '10' '4' -> 10000", c9he); TPow("powx057 power '10' '5' -> 100000", c9he); TPow("powx058 power '10' '6' -> 1000000", c9he); TPow("powx059 power '10' '7' -> 10000000", c9he); TPow("powx060 power '10' '8' -> 100000000", c9he); TPow("powx061 power '10' '9' -> 1.00000000E+9 Rounded", c9he); TPow("powx062 power '10' '22' -> 1.00000000E+22 Rounded", c9he); TPow("powx063 power '10' '77' -> 1.00000000E+77 Rounded", c9he); TPow("powx064 power '10' '99' -> 1.00000000E+99 Rounded", c9he); TPow("powx070 power '0.3' '0' -> '1'", c9he); TPow("powx071 power '0.3' '1' -> '0.3'", c9he); //TPow("powx072 power '0.3' '1.00' -> '0.3'", c9he); //TPow("powx073 power '0.3' '2.00' -> '0.09'", c9he); //TPow("powx074 power '0.3' '2.000000000' -> '0.09'", c9he); TPow("powx075 power '6.0' '1' -> '6.0' -- NB zeros not stripped", c9he); TPow("powx076 power '6.0' '2' -> '36.00' -- ..", c9he); TPow("powx077 power '-3' '2' -> '9' -- from NetRexx book", c9he); TPow("powx078 power '4' '3' -> '64' -- .. (sort of)", c9he); TPow("powx080 power 0.1 0 -> 1", c9he); TPow("powx081 power 0.1 1 -> 0.1", c9he); TPow("powx082 power 0.1 2 -> 0.01", c9he); TPow("powx083 power 0.1 3 -> 0.001", c9he); TPow("powx084 power 0.1 4 -> 0.0001", c9he); TPow("powx085 power 0.1 5 -> 0.00001", c9he); TPow("powx086 power 0.1 6 -> 0.000001", c9he); TPow("powx087 power 0.1 7 -> 1E-7", c9he); TPow("powx088 power 0.1 8 -> 1E-8", c9he); TPow("powx089 power 0.1 9 -> 1E-9", c9he); TPow("powx090 power 101 2 -> 10201", c9he); TPow("powx091 power 101 3 -> 1030301", c9he); TPow("powx092 power 101 4 -> 104060401", c9he); TPow("powx093 power 101 5 -> 1.05101005E+10 Inexact Rounded", c9he); TPow("powx094 power 101 6 -> 1.06152015E+12 Inexact Rounded", c9he); TPow("powx095 power 101 7 -> 1.07213535E+14 Inexact Rounded", c9he); //-- negative powers TPow("powx099 power '1' '-1' -> 1", c9he); TPow("powx100 power '3' '-1' -> 0.333333333 Inexact Rounded", c9he); TPow("powx101 power '2' '-1' -> 0.5", c9he); TPow("powx102 power '2' '-2' -> 0.25", c9he); TPow("powx103 power '2' '-4' -> 0.0625", c9he); TPow("powx104 power '2' '-8' -> 0.00390625", c9he); TPow("powx105 power '2' '-16' -> 0.0000152587891 Inexact Rounded", c9he); TPow("powx106 power '2' '-32' -> 2.32830644E-10 Inexact Rounded", c9he); TPow("powx108 power '2' '-64' -> 5.42101086E-20 Inexact Rounded", c9he); TPow("powx110 power '10' '-8' -> 1E-8", c9he); TPow("powx111 power '10' '-7' -> 1E-7", c9he); TPow("powx112 power '10' '-6' -> 0.000001", c9he); TPow("powx113 power '10' '-5' -> 0.00001", c9he); TPow("powx114 power '10' '-4' -> 0.0001", c9he); TPow("powx115 power '10' '-3' -> 0.001", c9he); TPow("powx116 power '10' '-2' -> 0.01", c9he); TPow("powx117 power '10' '-1' -> 0.1", c9he); TPow("powx121 power '10' '-77' -> '1E-77'", c9he); TPow("powx122 power '10' '-22' -> '1E-22'", c9he); TPow("powx123 power '2' '-1' -> '0.5'", c9he); TPow("powx124 power '2' '-2' -> '0.25'", c9he); TPow("powx125 power '2' '-4' -> '0.0625'", c9he); //TPow("powx126 power '0' '-1' -> Infinity", c9he); //TPow("powx127 power '0' '-2' -> Infinity", c9he); //TPow("powx128 power -0 '-1' -> -Infinity", c9he); //TPow("powx129 power -0 '-2' -> Infinity", c9he); }