public void EllipticEUnnormalValueTest() { MultiPrecision <Pow2.N8>[] nans = new MultiPrecision <Pow2.N8>[] { -1, 2, MultiPrecision <Pow2.N8> .PositiveInfinity, MultiPrecision <Pow2.N8> .NegativeInfinity, MultiPrecision <Pow2.N8> .NaN }; foreach (MultiPrecision <Pow2.N8> v in nans) { MultiPrecision <Pow2.N8> y = MultiPrecision <Pow2.N8> .EllipticE(v); Assert.IsTrue(y.IsNaN); } }
public void EllipticENearOneTest() { const int exponent = -32; { MultiPrecision <Pow2.N4>[] ks = { MultiPrecision <Pow2.N4> .BitDecrement(1), MultiPrecision <Pow2.N4> .BitDecrement(1 - MultiPrecision <Pow2.N4> .Ldexp(1,exponent)), 1 - MultiPrecision <Pow2.N4> .Ldexp(1, exponent), MultiPrecision <Pow2.N4> .BitIncrement(1 - MultiPrecision <Pow2.N4> .Ldexp(1,exponent)), }; foreach (var k in ks) { MultiPrecision <Pow2.N4> y4 = MultiPrecision <Pow2.N4> .EllipticE(k); MultiPrecision <Pow2.N8> y8 = MultiPrecision <Pow2.N8> .EllipticE(k.Convert <Pow2.N8>()); Console.WriteLine(k.ToHexcode()); Console.WriteLine(y4); Console.WriteLine(y4.ToHexcode()); Console.WriteLine(y8.ToHexcode()); Assert.IsTrue(MultiPrecision <Pow2.N4> .NearlyEqualBits(y4, y8.Convert <Pow2.N4>(), 32)); } } { MultiPrecision <Pow2.N8>[] ks = { MultiPrecision <Pow2.N8> .BitDecrement(1), MultiPrecision <Pow2.N8> .BitDecrement(1 - MultiPrecision <Pow2.N8> .Ldexp(1,exponent)), 1 - MultiPrecision <Pow2.N8> .Ldexp(1, exponent), MultiPrecision <Pow2.N8> .BitIncrement(1 - MultiPrecision <Pow2.N8> .Ldexp(1,exponent)), }; foreach (var k in ks) { MultiPrecision <Pow2.N8> y8 = MultiPrecision <Pow2.N8> .EllipticE(k); MultiPrecision <Pow2.N16> y16 = MultiPrecision <Pow2.N16> .EllipticE(k.Convert <Pow2.N16>()); Console.WriteLine(k.ToHexcode()); Console.WriteLine(y8); Console.WriteLine(y8.ToHexcode()); Console.WriteLine(y16.ToHexcode()); Assert.IsTrue(MultiPrecision <Pow2.N8> .NearlyEqualBits(y8, y16.Convert <Pow2.N8>(), 64)); } } { MultiPrecision <Pow2.N16>[] ks = { MultiPrecision <Pow2.N16> .BitDecrement(1), MultiPrecision <Pow2.N16> .BitDecrement(1 - MultiPrecision <Pow2.N16> .Ldexp(1,exponent)), 1 - MultiPrecision <Pow2.N16> .Ldexp(1, exponent), MultiPrecision <Pow2.N16> .BitIncrement(1 - MultiPrecision <Pow2.N16> .Ldexp(1,exponent)), }; foreach (var k in ks) { MultiPrecision <Pow2.N16> y16 = MultiPrecision <Pow2.N16> .EllipticE(k); MultiPrecision <Pow2.N32> y32 = MultiPrecision <Pow2.N32> .EllipticE(k.Convert <Pow2.N32>()); Console.WriteLine(k.ToHexcode()); Console.WriteLine(y16); Console.WriteLine(y16.ToHexcode()); Console.WriteLine(y32.ToHexcode()); Assert.IsTrue(MultiPrecision <Pow2.N16> .NearlyEqualBits(y16, y32.Convert <Pow2.N16>(), 128)); } } { MultiPrecision <Pow2.N32>[] ks = { MultiPrecision <Pow2.N32> .BitDecrement(1), MultiPrecision <Pow2.N32> .BitDecrement(1 - MultiPrecision <Pow2.N32> .Ldexp(1,exponent)), 1 - MultiPrecision <Pow2.N32> .Ldexp(1, exponent), MultiPrecision <Pow2.N32> .BitIncrement(1 - MultiPrecision <Pow2.N32> .Ldexp(1,exponent)), }; foreach (var k in ks) { MultiPrecision <Pow2.N32> y32 = MultiPrecision <Pow2.N32> .EllipticE(k); MultiPrecision <Pow2.N64> y64 = MultiPrecision <Pow2.N64> .EllipticE(k.Convert <Pow2.N64>()); Console.WriteLine(k.ToHexcode()); Console.WriteLine(y32); Console.WriteLine(y32.ToHexcode()); Console.WriteLine(y64.ToHexcode()); Assert.IsTrue(MultiPrecision <Pow2.N32> .NearlyEqualBits(y32, y64.Convert <Pow2.N32>(), 256)); } } }
public void EllipticETest() { double[] expecteds = { 1.5707963267948966192, 1.5704127613492695165, 1.5692612206533624497, 1.5673391612665478615, 1.5646423092625568944, 1.5611646068271051886, 1.5568981352002313413, 1.5518330115106139179, 1.5459572561054650350, 1.5392566258222057728, 1.5317144071889349200, 1.5233111616582831849, 1.5140244125021051094, 1.5038282596752396589, 1.4926929044313435533, 1.4805840591964266491, 1.4674622093394271555, 1.4532816807130160277, 1.4379894480673063924, 1.4215235911932390135, 1.4038112620302649031, 1.3847659565934378968, 1.3642837714465253786, 1.3422381292201173264, 1.3184721079946209974, 1.2927868476159125057, 1.2649231666855462759, 1.2345305754464217204, 1.2011106307369146978, 1.1639009595942138950, 1.1215931702323738421, 1.0714005291435245968, 1.0000000000000000000 }; for (int i = 0; i <= 32; i++) { decimal k = i / 32m; double expected = expecteds[i]; MultiPrecision <Pow2.N4> y4 = MultiPrecision <Pow2.N4> .EllipticE(k); MultiPrecision <Pow2.N8> y8 = MultiPrecision <Pow2.N8> .EllipticE(k); MultiPrecision <Pow2.N16> y16 = MultiPrecision <Pow2.N16> .EllipticE(k); MultiPrecision <Pow2.N32> y32 = MultiPrecision <Pow2.N32> .EllipticE(k); Console.WriteLine(k); Console.WriteLine(y4); Console.WriteLine(y4.ToHexcode()); Console.WriteLine(y8.ToHexcode()); Console.WriteLine(y16.ToHexcode()); Console.WriteLine(y32.ToHexcode()); Assert.AreEqual(expected, (double)y4, expected * 1e-15); Assert.IsTrue(MultiPrecision <Pow2.N4> .NearlyEqualBits(y4, y8.Convert <Pow2.N4>(), 1)); Assert.IsTrue(MultiPrecision <Pow2.N8> .NearlyEqualBits(y8, y16.Convert <Pow2.N8>(), 1)); Assert.IsTrue(MultiPrecision <Pow2.N16> .NearlyEqualBits(y16, y32.Convert <Pow2.N16>(), 1)); } }