public void CosHalfPIUnnormalValueTest() { MultiPrecision <Pow2.N8>[] vs = new MultiPrecision <Pow2.N8>[] { MultiPrecision <Pow2.N8> .NaN, MultiPrecision <Pow2.N8> .PositiveInfinity, MultiPrecision <Pow2.N8> .NegativeInfinity, }; foreach (MultiPrecision <Pow2.N8> v in vs) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .CosHalfPI(v); Assert.IsTrue(y.IsNaN); } }
public void CosHalfPILargeValueTest() { 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> .CosHalfPI(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Cos((double)x * Math.PI / 2), y, ignore_sign: true); ys.Add(y); } if (MultiPrecision <Pow2.N8> .Abs(b % 2) == 1) { TestTool.SmoothnessSatisfied(ys, 0.5); TestTool.MonotonicitySatisfied(ys); } else if (b % 2 == 0) { 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 CosHalfPITest() { foreach (MultiPrecision <Pow2.N8> x in TestTool.ShortRangeSet <Pow2.N8>()) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .CosHalfPI(x); Console.WriteLine(x); Console.WriteLine(y); TestTool.Tolerance(Math.Cos((double)x * Math.PI / 2), y, minerr: 1e-5, ignore_sign: true); } for (int x = -31; x <= 31; x += 2) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .CosHalfPI(x); Assert.AreEqual(MultiPrecision <Pow2.N8> .Zero, y); Assert.AreEqual(Sign.Plus, y.Sign); } Assert.IsTrue(MultiPrecision <Pow2.N8> .NearlyEqualBits( MultiPrecision <Pow2.N8> .Sqrt2 / 2, MultiPrecision <Pow2.N8> .CosHalfPI(MultiPrecision <Pow2.N8> .Div(1, 2)), 1)); Assert.IsTrue(MultiPrecision <Pow2.N8> .NearlyEqualBits( MultiPrecision <Pow2.N8> .Sqrt(3) / 2, MultiPrecision <Pow2.N8> .CosHalfPI(MultiPrecision <Pow2.N8> .Div(1, 3)), 1)); Assert.IsTrue(MultiPrecision <Pow2.N8> .NearlyEqualBits( MultiPrecision <Pow2.N8> .Point5, MultiPrecision <Pow2.N8> .CosHalfPI(MultiPrecision <Pow2.N8> .Div(2, 3)), 1)); Assert.IsTrue(MultiPrecision <Pow2.N16> .NearlyEqualBits( MultiPrecision <Pow2.N16> .Sqrt2 / 2, MultiPrecision <Pow2.N16> .CosHalfPI(MultiPrecision <Pow2.N16> .Div(1, 2)), 1)); Assert.IsTrue(MultiPrecision <Pow2.N16> .NearlyEqualBits( MultiPrecision <Pow2.N16> .Sqrt(3) / 2, MultiPrecision <Pow2.N16> .CosHalfPI(MultiPrecision <Pow2.N16> .Div(1, 3)), 1)); Assert.IsTrue(MultiPrecision <Pow2.N16> .NearlyEqualBits( MultiPrecision <Pow2.N16> .Point5, MultiPrecision <Pow2.N16> .CosHalfPI(MultiPrecision <Pow2.N16> .Div(2, 3)), 1)); }
public void CosHalfPIBorderTest() { 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> .CosHalfPI(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Cos((double)x * Math.PI / 2), y, ignore_sign: true); ys.Add(y); } if (MultiPrecision <Pow2.N8> .Abs(b % 2) == 1) { TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); } else if (b % 2 == 0) { TestTool.NearlyNeighbors(ys, 3); TestTool.SmoothnessSatisfied(ys, 0.5); } 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> .CosHalfPI(x); Console.WriteLine(x); Console.WriteLine(x.ToHexcode()); Console.WriteLine(y); Console.WriteLine(y.ToHexcode()); Console.Write("\n"); TestTool.Tolerance(Math.Cos((double)x * Math.PI / 2), y, ignore_sign: true); ys.Add(y); } if (MultiPrecision <Pow2.N16> .Abs(b % 2) == 1) { TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); } else if (b % 2 == 0) { TestTool.NearlyNeighbors(ys, 3); TestTool.SmoothnessSatisfied(ys, 0.5); } else { TestTool.NearlyNeighbors(ys, 4); TestTool.SmoothnessSatisfied(ys, 1); TestTool.MonotonicitySatisfied(ys); } Console.Write("\n"); } }