public static double Sqrt(double x) { if (x < 0) { throw new ArgumentException(""); } int count = 0; int a = 2; for (int i = 308; i > -15; i -= 2) { double b = x / PowI(10, i); if (b >= 1 && b < 10) { count = i / 2; break; } else if (b >= 1 && b >= 10) { count = i / 2; a = 6; break; } } double y = a * PowI(10, count); double x_n = (y + x / y) / 2.0; double tol = PowI(10, -12); while (1000 * Simple.Abs(y - x_n) >= tol) { y = x_n; x_n = (y + x / y) / 2.0; } return(y); }
public static double Pow(double x, double y) { if (y - (int)(y) == 0) { return(PowI(x, (int)(y))); } else if (x < 0 && (1 / y) % 2 == 0) { throw new ArgumentException("Imaginary number!"); } double answer = PowI(Simple.Abs(x), (int)(y)); double value = (Abs(y) - (int)(Abs(y))) * 10; int count = 1; while (value > 0) { answer *= Exp((int)(value) * Ln(Simple.Abs(x)) / PowI(10, count)); value -= (int)(value); value *= 10; count += 1; } if (x < 0) { return(0 - answer); } return(answer); }
public static double Sin(double x) { if (x == 0) { return(0); } else if (Simple.Abs(2 * x / pi - 3) % 4 == 0) { return(-1); } else if (Simple.Abs(2 * x / pi - 3) % 4 == 2) { return(1); } else if (Simple.Abs(x) % pi == 0) { return(0); } double y = x; if (x < 0) { y = Math.Round(0 - x / (2.0 * pi)) * 2.0 * pi + x; } double mod = y % (2.0 * pi); if (mod > pi / 2.0 && mod < pi) { y = pi - y; } else if (mod > pi && mod < 3.0 * pi / 2.0) { y -= pi; } else if (mod > 3.0 * pi / 2.0) { y = 2.0 * pi - y; } double x_n = y; UInt64 fact = 1; double answer = y / (1.0 * fact); for (int i = 1; i < 19; i += 2) { x_n *= y * y; fact = fact * (UInt64)((i + 1) * (i + 2)); answer += Simple.Pow(-1, (int)((i + 1) / 2)) * x_n / (1.0 * fact); } if (mod > pi) { return(0 - answer); } return(answer); }
public static double Arccos(double x) { if (x < -1 || x > 1) { throw new ArgumentException("Can't compute!"); } else if (x == -1) { return(0 - pi / 2.0); } else if (x == 1) { return(pi / 2.0); } else if (x == 0) { return(0.0); } double y = Simple.Abs(x); double x1 = pi / 2.0; double x2 = 0; double xm = pi / 4.0; double y2 = 0.0; while (y2 > Simple.Abs(x) + 0.000000000000001 || y2 < Simple.Abs(x) - 0.000000000000001) { double y1 = Cos(x1); y2 = Cos(x2); double ym = Cos(xm); double m1 = (xm - x1) / (ym - y1); double m2 = (x2 - xm) / (y2 - ym); if (y > y1 && y < ym) { x2 = m1 * (y - y1) + x1; } else if (y > ym && y < y2) { x2 = m2 * (y - ym) + xm; } xm = (x1 - x2) / 2.0 + x2; } if (x < 0) { return(pi - x2); } return(x2); }