Пример #1
0
        public static MultiPrecision <N> Atan(MultiPrecision <N> x)
        {
            if (x.IsNaN)
            {
                return(NaN);
            }

            if (!x.IsFinite)
            {
                return(x.Sign == Sign.Plus ? PI / 2 : -PI / 2);
            }

            MultiPrecision <Plus1 <N> > x_ex = x.Convert <Plus1 <N> >();

            if (x <= One && x >= MinusOne)
            {
                MultiPrecision <Plus1 <N> > z = MultiPrecision <Plus1 <N> > .Abs(x_ex) / MultiPrecision <Plus1 <N> > .Sqrt(x_ex *x_ex + 1);

                MultiPrecision <N> w = MultiPrecision <Plus1 <N> > .Sqrt(MultiPrecision <Plus1 <N> > .SquareAsin(z)).Convert <N>();

                if (w.IsZero)
                {
                    return(x);
                }

                return(new MultiPrecision <N>(x.Sign, w.exponent, w.mantissa));
            }
            else
            {
                MultiPrecision <Plus1 <N> > invx = 1 / x_ex;
                MultiPrecision <Plus1 <N> > z    = MultiPrecision <Plus1 <N> > .Abs(invx) / MultiPrecision <Plus1 <N> > .Sqrt(invx *invx + 1);

                MultiPrecision <N> w = MultiPrecision <Plus1 <N> > .Sqrt(MultiPrecision <Plus1 <N> > .SquareAsin(z)).Convert <N>();

                if (x.Sign == Sign.Plus)
                {
                    return(PI / 2 - w);
                }
                else
                {
                    return(w - PI / 2);
                }
            }
        }
            public void Append(MultiPrecision <N> new_value)
            {
                if (values.Length <= 0)
                {
                    values = new MultiPrecision <N>[] { new_value };
                    return;
                }

                MultiPrecision <N>[] values_next = new MultiPrecision <N> [values.Length + 1];

                values_next[0] = new_value;

                for (int i = 1; i <= values.Length; i++)
                {
                    values_next[i] = values_next[i - 1] + (values_next[i - 1] - values[i - 1]) * R(i);
                }

                Epsilon = MultiPrecision <N> .Abs(values_next.Last() - values.Last());

                values = values_next;
            }
Пример #3
0
        public static MultiPrecision <N> Asin(MultiPrecision <N> x)
        {
            if (!(x >= MinusOne && x <= One))
            {
                return(NaN);
            }

            if (x == MinusOne)
            {
                return(-PI / 2);
            }
            if (x == One)
            {
                return(PI / 2);
            }

            if (Abs(x) <= Sqrt2 / 2)
            {
                MultiPrecision <Plus1 <N> > x_ex = x.Convert <Plus1 <N> >();

                MultiPrecision <N> w =
                    MultiPrecision <Plus1 <N> > .Sqrt(
                        MultiPrecision <Plus1 <N> > .SquareAsin(
                            MultiPrecision <Plus1 <N> > .Abs(x_ex))).Convert <N>();

                if (w.IsZero)
                {
                    return(x);
                }

                return(new MultiPrecision <N>(x.Sign, w.exponent, w.mantissa));
            }
            else
            {
                MultiPrecision <N> z = x / (Sqrt(1 - x * x) + 1);
                return(Atan(z) * 2);
            }
        }