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