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 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); } }