Пример #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);
                }
            }
        }
Пример #2
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);
            }
        }