public void GammaBorderTest() { MultiPrecision <Pow2.N8>[] borders = new MultiPrecision <Pow2.N8>[] { 0.5, 1 }; foreach (MultiPrecision <Pow2.N8> b in borders) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Gamma(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Approx.Gamma((double)x), y, ignore_sign: true); ys.Add(y); } TestTool.NearlyNeighbors(ys, 2); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } }
public void Atan2BorderTest() { foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor <Pow2.N8>(0)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Atan2(x, 1); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Atan2((double)x, 1), y); } Console.Write("\n"); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor <Pow2.N8>(0)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Atan2(x, -1); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Atan2((double)x, -1), y); } Console.Write("\n"); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor <Pow2.N8>(0)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Atan2(1, x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Atan2(1, (double)x), y); } Console.Write("\n"); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor <Pow2.N8>(0)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Atan2(-1, x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Atan2(-1, (double)x), y); } }
public void SinhBorderTest() { MultiPrecision <Pow2.N8>[] borders = new MultiPrecision <Pow2.N8>[] { -1, 0, 1 }; foreach (MultiPrecision <Pow2.N8> b in borders) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Sinh(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Sinh((double)x), y); ys.Add(y); } if (b != 0) { TestTool.NearlyNeighbors(ys, 2); } TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } }
public void Pow2BorderTest() { MultiPrecision <Pow2.N8>[] borders_n8 = new MultiPrecision <Pow2.N8>[] { -2, -1, -0.5, 0, 0.5, 1, 2 }; foreach (MultiPrecision <Pow2.N8> b in borders_n8) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Pow2(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Pow(2, (double)x), y); ys.Add(y); } TestTool.NearlyNeighbors(ys, 4); TestTool.SmoothnessSatisfied(ys, 1.25); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } MultiPrecision <Pow2.N16>[] borders_n16 = new MultiPrecision <Pow2.N16>[] { -2, -1, -0.5, 0, 0.5, 1, 2 }; foreach (MultiPrecision <Pow2.N16> b in borders_n16) { List <MultiPrecision <Pow2.N16> > ys = new(); foreach (MultiPrecision <Pow2.N16> x in TestTool.EnumerateNeighbor(b)) { MultiPrecision <Pow2.N16> y = MultiPrecision <Pow2.N16> .Pow2(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Pow(2, (double)x), y); ys.Add(y); } TestTool.NearlyNeighbors(ys, 4); TestTool.SmoothnessSatisfied(ys, 1.25); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } }
public void InverseErfBorderTest() { MultiPrecision <Pow2.N8>[] borders = new MultiPrecision <Pow2.N8>[] { 0, -1, 1, -MultiPrecision <Pow2.N8> .Ldexp(MultiPrecision <Pow2.N8> .Epsilon, 1), +MultiPrecision <Pow2.N8> .Ldexp(MultiPrecision <Pow2.N8> .Epsilon, 1), -MultiPrecision <Pow2.N8> .Ldexp(1, -63), +MultiPrecision <Pow2.N8> .Ldexp(1, -63) }; foreach (MultiPrecision <Pow2.N8> b in borders) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b, 4)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .InverseErf(x); MultiPrecision <Pow2.N8> z = MultiPrecision <Pow2.N8> .Erf(y); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.WriteLine(z); Console.WriteLine(z.ToHexcode()); Console.Write("\n"); if (y.IsFinite && !y.IsZero) { Assert.IsTrue(MultiPrecision <Pow2.N8> .NearlyEqualBits(x, z, 1)); } if (y.IsFinite) { ys.Add(y); } } if (b != -1 && b != 1) { if (b != 0) { TestTool.NearlyNeighbors(ys, 32); } TestTool.SmoothnessSatisfied(ys, 0.5); TestTool.MonotonicitySatisfied(ys); } Console.Write("\n"); } }
public void SinHalfPILargeValueTest() { MultiPrecision <Pow2.N8> half = MultiPrecision <Pow2.N8> .Point5; MultiPrecision <Pow2.N8>[] borders = new MultiPrecision <Pow2.N8>[] { -65538, -65537 - half, -65537, -65536 - half, -65536, -65535 - half, 65535 + half, 65536, 65536 + half, 65537, 65537 + half, 65538 }; foreach (MultiPrecision <Pow2.N8> b in borders) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .SinHalfPI(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Sin((double)x * Math.PI / 2), y, ignore_sign: true); ys.Add(y); } if (b % 2 == 0) { TestTool.SmoothnessSatisfied(ys, 0.5); TestTool.MonotonicitySatisfied(ys); } else if (MultiPrecision <Pow2.N8> .Abs(b % 2) == 1) { TestTool.NearlyNeighbors(ys, 19); TestTool.SmoothnessSatisfied(ys, 0.5); } else { TestTool.NearlyNeighbors(ys, 20); TestTool.SmoothnessSatisfied(ys, 0.5); TestTool.MonotonicitySatisfied(ys); } Console.Write("\n"); } }
public void LogGammaBorderTest() { MultiPrecision <Pow2.N8>[] borders = new MultiPrecision <Pow2.N8>[] { 1 - MultiPrecision <Pow2.N8> .Ldexp(1, -31), 1 + MultiPrecision <Pow2.N8> .Ldexp(1, -31), 2 - MultiPrecision <Pow2.N8> .Ldexp(1, -31), 2 + MultiPrecision <Pow2.N8> .Ldexp(1, -31), MultiPrecision <Pow2.N8> .Ldexp(1, -1), MultiPrecision <Pow2.N8> .Ldexp(1, -2), 0, 1, 2, 3, 4, 32, 64 }; foreach (MultiPrecision <Pow2.N8> b in borders) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b)) { if (x <= 0) { continue; } MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .LogGamma(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); if (y.IsFinite) { ys.Add(y); } } if (b != 1 && b != 2) { TestTool.NearlyNeighbors(ys, 36); } TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } }
public void Log2BorderTest() { MultiPrecision <Pow2.N8>[] borders = new MultiPrecision <Pow2.N8>[] { 0, 1, 2, 4 }; foreach (MultiPrecision <Pow2.N8> b in borders) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b)) { if (x.Sign == Sign.Minus) { continue; } MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Log2(x); if (y.IsFinite) { ys.Add(y); } Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); if ((double)x == 0) { continue; } TestTool.Tolerance(Math.Log2((double)x), y, ignore_sign: true); } if (b != 1 && b != 2) { TestTool.NearlyNeighbors(ys, 2); } TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } }
public void ArtanhBorderTest() { MultiPrecision <Pow2.N8>[] borders = new MultiPrecision <Pow2.N8>[] { -1, 0, 1 }; foreach (MultiPrecision <Pow2.N8> b in borders) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b)) { if (x < -1 || x > 1) { continue; } MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Artanh(x); ys.Add(y); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); if (Math.Abs((double)x) == 1) { continue; } TestTool.Tolerance(Math.Atanh((double)x), y, ignore_expected_nan: true); } TestTool.SmoothnessSatisfied(ys, b == 0 ? 0.5 : 2); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } }
public void TanPIBorderTest() { MultiPrecision <Pow2.N8>[] borders = new MultiPrecision <Pow2.N8>[] { 0, -1, 1 }; foreach (MultiPrecision <Pow2.N8> b in borders) { foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .TanPI(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Tan((double)x * Math.PI), y, ignore_sign: true); } Console.Write("\n"); } }
public void RcpBorderTest() { MultiPrecision <Pow2.N8>[] borders = new MultiPrecision <Pow2.N8>[] { -2, -1, -0.5, 0.5, 1, 2 }; foreach (MultiPrecision <Pow2.N8> b in borders) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Rcp(x); MultiPrecision <Pow2.N8> z = MultiPrecision <Pow2.N8> .Rcp(y); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.WriteLine(z); Console.WriteLine(z.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(1 / (double)x, y); Assert.IsTrue(MultiPrecision <Pow2.N8> .NearlyEqualBits(x, z, 1)); ys.Add(y); } TestTool.NearlyNeighbors(ys, 2); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } }
public void SinHalfPIBorderTest() { MultiPrecision <Pow2.N8> half_n8 = MultiPrecision <Pow2.N8> .Point5; MultiPrecision <Pow2.N8>[] borders_n8 = new MultiPrecision <Pow2.N8>[] { -4 - half_n8, -4, -3 - half_n8, -3, -2 - half_n8, -2, -1 - half_n8, -1, -0 - half_n8, 0, 0 + half_n8, 1, 1 + half_n8, 2, 2 + half_n8, 3, 3 + half_n8, 4, 4 + half_n8 }; foreach (MultiPrecision <Pow2.N8> b in borders_n8) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .SinHalfPI(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Sin((double)x * Math.PI / 2), y, ignore_sign: true); ys.Add(y); } if (b % 2 == 0) { TestTool.SmoothnessSatisfied(ys, 0.5); TestTool.MonotonicitySatisfied(ys); } else if (MultiPrecision <Pow2.N8> .Abs(b % 2) == 1) { TestTool.NearlyNeighbors(ys, 3); TestTool.SmoothnessSatisfied(ys, 1); } else { TestTool.NearlyNeighbors(ys, 4); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); } Console.Write("\n"); } MultiPrecision <Pow2.N16> half_n16 = MultiPrecision <Pow2.N16> .Point5; MultiPrecision <Pow2.N16>[] borders_n16 = new MultiPrecision <Pow2.N16>[] { -4 - half_n16, -4, -3 - half_n16, -3, -2 - half_n16, -2, -1 - half_n16, -1, -0 - half_n16, 0, 0 + half_n16, 1, 1 + half_n16, 2, 2 + half_n16, 3, 3 + half_n16, 4, 4 + half_n16 }; foreach (MultiPrecision <Pow2.N16> b in borders_n16) { List <MultiPrecision <Pow2.N16> > ys = new(); foreach (MultiPrecision <Pow2.N16> x in TestTool.EnumerateNeighbor(b)) { MultiPrecision <Pow2.N16> y = MultiPrecision <Pow2.N16> .SinHalfPI(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Sin((double)x * Math.PI / 2), y, ignore_sign: true); ys.Add(y); } if (b % 2 == 0) { TestTool.SmoothnessSatisfied(ys, 0.5); TestTool.MonotonicitySatisfied(ys); } else if (MultiPrecision <Pow2.N16> .Abs(b % 2) == 1) { TestTool.NearlyNeighbors(ys, 3); TestTool.SmoothnessSatisfied(ys, 1); } else { TestTool.NearlyNeighbors(ys, 4); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); } Console.Write("\n"); } }
public void AtanBorderTest() { MultiPrecision <Pow2.N8>[] borders_n8 = new MultiPrecision <Pow2.N8>[] { MultiPrecision <Pow2.N8> .NegativeInfinity, -2, -1, -MultiPrecision <Pow2.N8> .Ldexp(1, int.MinValue / 2), 0, +MultiPrecision <Pow2.N8> .Ldexp(1, int.MinValue / 2), 1, 2, MultiPrecision <Pow2.N8> .PositiveInfinity }; foreach (MultiPrecision <Pow2.N8> b in borders_n8) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Atan(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Atan((double)x), y); ys.Add(y); } if (b != 0) { TestTool.NearlyNeighbors(ys, 2); } TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } MultiPrecision <Pow2.N16>[] borders_n16 = new MultiPrecision <Pow2.N16>[] { MultiPrecision <Pow2.N16> .NegativeInfinity, -2, -1, -MultiPrecision <Pow2.N16> .Ldexp(1, int.MinValue / 2), 0, +MultiPrecision <Pow2.N16> .Ldexp(1, int.MinValue / 2), 1, 2, MultiPrecision <Pow2.N16> .PositiveInfinity }; foreach (MultiPrecision <Pow2.N16> b in borders_n16) { List <MultiPrecision <Pow2.N16> > ys = new(); foreach (MultiPrecision <Pow2.N16> x in TestTool.EnumerateNeighbor(b)) { MultiPrecision <Pow2.N16> y = MultiPrecision <Pow2.N16> .Atan(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Atan((double)x), y); ys.Add(y); } if (b != 0) { TestTool.NearlyNeighbors(ys, 2); } TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } }
public void AcosBorderTest() { MultiPrecision <Pow2.N8>[] borders_n8 = new MultiPrecision <Pow2.N8>[] { -MultiPrecision <Pow2.N8> .Ldexp(MultiPrecision <Pow2.N8> .Sqrt2, -1), MultiPrecision <Pow2.N8> .Ldexp(MultiPrecision <Pow2.N8> .Sqrt2, -1), 0 }; foreach (MultiPrecision <Pow2.N8> b in borders_n8) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Acos(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Acos((double)x), y); ys.Add(y); } TestTool.NearlyNeighbors(ys, 2); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } MultiPrecision <Pow2.N16>[] borders_n16 = new MultiPrecision <Pow2.N16>[] { -MultiPrecision <Pow2.N16> .Ldexp(MultiPrecision <Pow2.N16> .Sqrt2, -1), MultiPrecision <Pow2.N16> .Ldexp(MultiPrecision <Pow2.N16> .Sqrt2, -1), 0 }; foreach (MultiPrecision <Pow2.N16> b in borders_n16) { List <MultiPrecision <Pow2.N16> > ys = new(); foreach (MultiPrecision <Pow2.N16> x in TestTool.EnumerateNeighbor(b)) { MultiPrecision <Pow2.N16> y = MultiPrecision <Pow2.N16> .Acos(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Acos((double)x), y); ys.Add(y); } TestTool.NearlyNeighbors(ys, 2); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } }
public void ErfcBorderTest() { foreach (MultiPrecision <Pow2.N4> b in new MultiPrecision <Pow2.N4>[] { 8 }) { List <MultiPrecision <Pow2.N4> > ys = new(); foreach (MultiPrecision <Pow2.N4> x in TestTool.EnumerateNeighbor(b, 2)) { MultiPrecision <Pow2.N4> y = MultiPrecision <Pow2.N4> .Erfc(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(ErfcApprox((double)x), y, minerr: 1e-2); ys.Add(y); } TestTool.NearlyNeighbors(ys, 12); TestTool.SmoothnessSatisfied(ys, 0.5); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } foreach (MultiPrecision <Pow2.N8> b in new MultiPrecision <Pow2.N8>[] { 8 }) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b, 2)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Erfc(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(ErfcApprox((double)x), y, minerr: 1e-2); ys.Add(y); } TestTool.NearlyNeighbors(ys, 12); TestTool.SmoothnessSatisfied(ys, 0.5); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } foreach (MultiPrecision <Pow2.N16> b in new MultiPrecision <Pow2.N16>[] { 8 }) { List <MultiPrecision <Pow2.N16> > ys = new(); foreach (MultiPrecision <Pow2.N16> x in TestTool.EnumerateNeighbor(b, 2)) { MultiPrecision <Pow2.N16> y = MultiPrecision <Pow2.N16> .Erfc(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(ErfcApprox((double)x), y, minerr: 1e-2); ys.Add(y); } TestTool.NearlyNeighbors(ys, 12); TestTool.SmoothnessSatisfied(ys, 0.5); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } foreach (MultiPrecision <Pow2.N32> b in new MultiPrecision <Pow2.N32>[] { 8 }) { List <MultiPrecision <Pow2.N32> > ys = new(); foreach (MultiPrecision <Pow2.N32> x in TestTool.EnumerateNeighbor(b, 2)) { MultiPrecision <Pow2.N32> y = MultiPrecision <Pow2.N32> .Erfc(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(ErfcApprox((double)x), y, minerr: 1e-2); ys.Add(y); } TestTool.NearlyNeighbors(ys, 12); TestTool.SmoothnessSatisfied(ys, 0.5); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } foreach (MultiPrecision <Pow2.N64> b in new MultiPrecision <Pow2.N64>[] { 8 }) { List <MultiPrecision <Pow2.N64> > ys = new(); foreach (MultiPrecision <Pow2.N64> x in TestTool.EnumerateNeighbor(b, 2)) { MultiPrecision <Pow2.N64> y = MultiPrecision <Pow2.N64> .Erfc(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(ErfcApprox((double)x), y, minerr: 1e-2); ys.Add(y); } TestTool.NearlyNeighbors(ys, 12); TestTool.SmoothnessSatisfied(ys, 0.5); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } foreach (MultiPrecision <Pow2.N128> b in new MultiPrecision <Pow2.N128>[] { 8 }) { List <MultiPrecision <Pow2.N128> > ys = new(); foreach (MultiPrecision <Pow2.N128> x in TestTool.EnumerateNeighbor(b, 2)) { MultiPrecision <Pow2.N128> y = MultiPrecision <Pow2.N128> .Erfc(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(ErfcApprox((double)x), y, minerr: 1e-2); ys.Add(y); } TestTool.NearlyNeighbors(ys, 12); TestTool.SmoothnessSatisfied(ys, 0.5); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } foreach (MultiPrecision <Pow2.N256> b in new MultiPrecision <Pow2.N256>[] { 8 }) { List <MultiPrecision <Pow2.N256> > ys = new(); foreach (MultiPrecision <Pow2.N256> x in TestTool.EnumerateNeighbor(b, 2)) { MultiPrecision <Pow2.N256> y = MultiPrecision <Pow2.N256> .Erfc(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(ErfcApprox((double)x), y, minerr: 1e-2); ys.Add(y); } TestTool.NearlyNeighbors(ys, 12); TestTool.SmoothnessSatisfied(ys, 0.5); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } }
public void DigammaApproxBorderTest() { { List <MultiPrecision <Pow2.N4> > ys = new(); foreach (MultiPrecision <Pow2.N4> x in TestTool.EnumerateNeighbor((MultiPrecision <Pow2.N4>) 16, 4)) { MultiPrecision <Pow2.N4> y = MultiPrecision <Pow2.N4> .Digamma(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); ys.Add(y); } TestTool.NearlyNeighbors(ys, 14); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); } { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor((MultiPrecision <Pow2.N8>) 32, 4)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Digamma(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); ys.Add(y); } TestTool.NearlyNeighbors(ys, 14); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); } { List <MultiPrecision <Pow2.N16> > ys = new(); foreach (MultiPrecision <Pow2.N16> x in TestTool.EnumerateNeighbor((MultiPrecision <Pow2.N16>) 60, 4)) { MultiPrecision <Pow2.N16> y = MultiPrecision <Pow2.N16> .Digamma(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); ys.Add(y); } TestTool.NearlyNeighbors(ys, 14); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); } { List <MultiPrecision <Pow2.N32> > ys = new(); foreach (MultiPrecision <Pow2.N32> x in TestTool.EnumerateNeighbor((MultiPrecision <Pow2.N32>) 116, 4)) { MultiPrecision <Pow2.N32> y = MultiPrecision <Pow2.N32> .Digamma(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); ys.Add(y); } TestTool.NearlyNeighbors(ys, 14); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); } { List <MultiPrecision <Pow2.N64> > ys = new(); foreach (MultiPrecision <Pow2.N64> x in TestTool.EnumerateNeighbor((MultiPrecision <Pow2.N64>) 228, 4)) { MultiPrecision <Pow2.N64> y = MultiPrecision <Pow2.N64> .Digamma(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); ys.Add(y); } TestTool.NearlyNeighbors(ys, 14); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); } { List <MultiPrecision <Pow2.N128> > ys = new(); foreach (MultiPrecision <Pow2.N128> x in TestTool.EnumerateNeighbor((MultiPrecision <Pow2.N128>) 456, 4)) { MultiPrecision <Pow2.N128> y = MultiPrecision <Pow2.N128> .Digamma(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); ys.Add(y); } TestTool.NearlyNeighbors(ys, 14); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); } { List <MultiPrecision <Pow2.N256> > ys = new(); foreach (MultiPrecision <Pow2.N256> x in TestTool.EnumerateNeighbor((MultiPrecision <Pow2.N256>) 908, 4)) { MultiPrecision <Pow2.N256> y = MultiPrecision <Pow2.N256> .Digamma(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); ys.Add(y); } TestTool.NearlyNeighbors(ys, 14); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); } }
public void Expm1BorderTest() { MultiPrecision <Pow2.N8>[] borders_n8 = new MultiPrecision <Pow2.N8>[] { -1, 0, 1 }; foreach (MultiPrecision <Pow2.N8> b in borders_n8) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b, 5)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Expm1(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Exp((double)x) - 1, y); ys.Add(y); } if (b != 0) { TestTool.NearlyNeighbors(ys, 3); } TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } MultiPrecision <Pow2.N16>[] borders_n16 = new MultiPrecision <Pow2.N16>[] { -1, 0, 1 }; foreach (MultiPrecision <Pow2.N16> b in borders_n16) { List <MultiPrecision <Pow2.N16> > ys = new(); foreach (MultiPrecision <Pow2.N16> x in TestTool.EnumerateNeighbor(b, 5)) { MultiPrecision <Pow2.N16> y = MultiPrecision <Pow2.N16> .Expm1(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Exp((double)x) - 1, y); ys.Add(y); } if (b != 0) { TestTool.NearlyNeighbors(ys, 3); } TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } }
public void SqrtBorderTest() { MultiPrecision <Pow2.N8>[] borders_n8 = new MultiPrecision <Pow2.N8>[] { 0, 1, 4 }; foreach (MultiPrecision <Pow2.N8> b in borders_n8) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b)) { if (x.Sign == Sign.Minus) { continue; } MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Sqrt(x); MultiPrecision <Pow2.N8> z = MultiPrecision <Pow2.N8> .Square(y); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.WriteLine(z); Console.WriteLine(z.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Sqrt((double)x), y); if (b != 0) { Assert.IsTrue(MultiPrecision <Pow2.N8> .NearlyEqualBits(x, z, 1)); } ys.Add(y); } if (b != 0) { TestTool.NearlyNeighbors(ys, 1); } TestTool.SmoothnessSatisfied(ys, (b != 0) ? 1 : 10); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } MultiPrecision <Pow2.N16>[] borders_n16 = new MultiPrecision <Pow2.N16>[] { 0, 1, 4 }; foreach (MultiPrecision <Pow2.N16> b in borders_n16) { List <MultiPrecision <Pow2.N16> > ys = new(); foreach (MultiPrecision <Pow2.N16> x in TestTool.EnumerateNeighbor(b)) { if (x.Sign == Sign.Minus) { continue; } MultiPrecision <Pow2.N16> y = MultiPrecision <Pow2.N16> .Sqrt(x); MultiPrecision <Pow2.N16> z = MultiPrecision <Pow2.N16> .Square(y); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.WriteLine(z); Console.WriteLine(z.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Sqrt((double)x), y); if (b != 0) { Assert.IsTrue(MultiPrecision <Pow2.N16> .NearlyEqualBits(x, z, 1)); } ys.Add(y); } if (b != 0) { TestTool.NearlyNeighbors(ys, 1); } TestTool.SmoothnessSatisfied(ys, (b != 0) ? 1 : 10); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } }
public void ToStringTest() { foreach (MultiPrecision <Pow2.N8> x in TestTool.AllRangeSet <Pow2.N8>().Concat(TestTool.LimitSet <Pow2.N8>())) { foreach (MultiPrecision <Pow2.N8> v in TestTool.EnumerateNeighbor(x, x.IsZero ? 0 : 2)) { (Sign sign, Int64 exponent_dec, Accumulator <Pow2.N8> mantissa_dec) = v.ToStringCore(MultiPrecision <Pow2.N8> .DecimalDigits); Console.WriteLine(sign); Console.WriteLine(exponent_dec); Console.WriteLine(mantissa_dec); Console.WriteLine(v.ToString()); Console.WriteLine($"{v:E10}"); Console.WriteLine(v.ToString("e10")); MultiPrecision <Pow2.N8> u = v.ToString(); Console.WriteLine(u.ToString()); Console.WriteLine(v.ToHexcode()); Console.WriteLine(u.ToHexcode()); Assert.IsTrue(MultiPrecision <Pow2.N8> .NearlyEqualBits(v, u, 14)); Assert.AreEqual((double)v, double.Parse(v.ToString()), Math.Abs((double)v) * 1e-8); } } foreach (MultiPrecision <Pow2.N16> x in TestTool.AllRangeSet <Pow2.N16>().Concat(TestTool.LimitSet <Pow2.N16>())) { foreach (MultiPrecision <Pow2.N16> v in TestTool.EnumerateNeighbor(x, x.IsZero ? 0 : 2)) { (Sign sign, Int64 exponent_dec, Accumulator <Pow2.N16> mantissa_dec) = v.ToStringCore(MultiPrecision <Pow2.N16> .DecimalDigits); Console.WriteLine(sign); Console.WriteLine(exponent_dec); Console.WriteLine(mantissa_dec); Console.WriteLine(v.ToString()); Console.WriteLine($"{v:E10}"); Console.WriteLine(v.ToString("e10")); MultiPrecision <Pow2.N16> u = v.ToString(); Console.WriteLine(u.ToString()); Console.WriteLine(v.ToHexcode()); Console.WriteLine(u.ToHexcode()); Assert.IsTrue(MultiPrecision <Pow2.N16> .NearlyEqualBits(v, u, 14)); Assert.AreEqual((double)v, double.Parse(v.ToString()), Math.Abs((double)v) * 1e-8); } } for (long i = int.MinValue; i < int.MinValue + 120; i++) { MultiPrecision <Pow2.N8> v = new MultiPrecision <Pow2.N8>(Sign.Plus, i, Mantissa <Pow2.N8> .One, round: false); (Sign sign, Int64 exponent_dec, Accumulator <Pow2.N8> mantissa_dec) = v.ToStringCore(MultiPrecision <Pow2.N8> .DecimalDigits); Console.WriteLine(sign); Console.WriteLine(exponent_dec); Console.WriteLine(mantissa_dec); Console.WriteLine(v.ToString()); Console.WriteLine($"{v:E10}"); Console.WriteLine(v.ToString("e10")); MultiPrecision <Pow2.N8> u = v.ToString(); Console.WriteLine(u.ToString()); Console.WriteLine(v.ToHexcode()); Console.WriteLine(u.ToHexcode()); Assert.AreEqual((double)v, double.Parse(v.ToString()), Math.Abs((double)v) * 1e-8); } for (long i = int.MaxValue - 120; i < int.MaxValue; i++) { MultiPrecision <Pow2.N8> v = new MultiPrecision <Pow2.N8>(Sign.Plus, i, Mantissa <Pow2.N8> .One, round: false); (Sign sign, Int64 exponent_dec, Accumulator <Pow2.N8> mantissa_dec) = v.ToStringCore(MultiPrecision <Pow2.N8> .DecimalDigits); Console.WriteLine(sign); Console.WriteLine(exponent_dec); Console.WriteLine(mantissa_dec); Console.WriteLine(v.ToString()); Console.WriteLine($"{v:E10}"); Console.WriteLine(v.ToString("e10")); MultiPrecision <Pow2.N8> u = v.ToString(); Console.WriteLine(u.ToString()); Console.WriteLine(v.ToHexcode()); Console.WriteLine(u.ToHexcode()); Assert.AreEqual((double)v, double.Parse(v.ToString()), Math.Abs((double)v) * 1e-8); } { MultiPrecision <Pow2.N8> v = MultiPrecision <Pow2.N8> .PI; (Sign sign, Int64 exponent_dec, Accumulator <Pow2.N8> mantissa_dec) = v.ToStringCore(MultiPrecision <Pow2.N8> .DecimalDigits); Console.WriteLine(sign); Console.WriteLine(exponent_dec); Console.WriteLine(mantissa_dec); Console.WriteLine(v.ToString()); Console.WriteLine($"{v:E10}"); Console.WriteLine(v.ToString("e10")); MultiPrecision <Pow2.N8> u = v.ToString(); Console.WriteLine(u.ToString()); Console.WriteLine(v.ToHexcode()); Console.WriteLine(u.ToHexcode()); Assert.AreEqual((double)v, double.Parse(v.ToString()), Math.Abs((double)v) * 1e-8); } string p99 = "0.999"; for (int i = 0; i < 100; i++) { p99 += "9"; MultiPrecision <Pow2.N8> u = p99; Console.WriteLine(u.ToString()); Console.WriteLine(u.ToHexcode()); Assert.AreEqual(double.Parse(p99), (double)u, 1e-100); } }
public void Log1pBorderTest() { MultiPrecision <Pow2.N8>[] borders_n8 = new MultiPrecision <Pow2.N8>[] { -0.25, 0, 0.25 }; foreach (MultiPrecision <Pow2.N8> b in borders_n8) { List <MultiPrecision <Pow2.N8> > ys = new(); foreach (MultiPrecision <Pow2.N8> x in TestTool.EnumerateNeighbor(b, n: 4)) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .Log1p(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Log(1 + (double)x), y, ignore_sign: true); ys.Add(y); } if (b != 0) { TestTool.NearlyNeighbors(ys, 2); } TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } MultiPrecision <Pow2.N16>[] borders_n16 = new MultiPrecision <Pow2.N16>[] { -0.25, 0, 0.25 }; foreach (MultiPrecision <Pow2.N16> b in borders_n16) { List <MultiPrecision <Pow2.N16> > ys = new(); foreach (MultiPrecision <Pow2.N16> x in TestTool.EnumerateNeighbor(b, n: 4)) { MultiPrecision <Pow2.N16> y = MultiPrecision <Pow2.N16> .Log1p(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Log(1 + (double)x), y, ignore_sign: true); ys.Add(y); } if (b != 0) { TestTool.NearlyNeighbors(ys, 2); } TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); Console.Write("\n"); } }