예제 #1
0
        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);
            }
        }
예제 #2
0
        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));
                }
            }
        }
예제 #3
0
        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));
            }
        }