コード例 #1
0
        public void BestDouble()
        {
            var r = Rational.Best(Math.PI);

            Trace.WriteLine($"{r.p} / {r.q}");
            Trace.WriteLine($"\\frac {{{Num(r.p)}}} {{{Num(r.q)}}}");
            Assert.AreEqual(Math.PI, (double)r.p / (double)r.q);
            var rand = new Random();

            for (var i = 0; i < 10000; i++)
            {
                var x = 1 / (rand.NextDouble() - .5);
                r = Rational.Best(x);
                Assert.AreEqual(x, (double)r.p / (double)r.q);
            }
        }
コード例 #2
0
        public void BestFloat()
        {
            var r = Rational.Best((float)Math.PI);

            Trace.WriteLine($"{r.p} / {r.q}");
            Trace.WriteLine($"\\frac {{{Num(r.p)}}} {{{Num(r.q)}}}");
            Assert.AreEqual((float)Math.PI, (float)r.p / (float)r.q);
            var rand = new Random();

            for (var i = 0; i < 1000; i++)
            {
                var x = 1 / ((float)rand.NextDouble() - .5f);
                r = Rational.Best(x);
                Assert.AreEqual(x, (float)r.p / (float)r.q);

                while (r.q > 1)
                {
                    r = new Rational((BigInteger)((double)(r.q - 1) * x + .5), r.q - 1);
                    Assert.AreNotEqual(x, (float)r.p / (float)r.q);
                }
            }
        }
コード例 #3
0
        public void TableOfBest()
        {
            void Row(string name, double d)
            {
                Trace.Write($"|$${name}$$|{d}|");
                var r = Rational.Best(d);

                Trace.Write("$$\\frac {" + Num(r.p) + "} {" + Num(r.q) + "}$$|");
                r = Rational.Best((float)d);
                Trace.WriteLine("$$\\frac {" + Num(r.p) + "} {" + Num(r.q) + "}$$|");
            }

            Row("\\pi", Math.PI);
            Row("e", Math.E);
            Row("\\sqrt 2", Math.Sqrt(2));
            Row("\\phi", (Math.Sqrt(5) + 1) / 2);
            Row("ln(2)", Math.Log(2));
            Row("\\gamma", 0.57721566490153286);
            Row("G", 0.915965594177219015054603514932384110774);
            Row("\\zeta(3)", 1.202056903159594);
            Row("\\sqrt {2\\pi}", Math.Sqrt(2 * Math.PI));
        }