static BigNumber Logarithm(BigNumber y) { // y in ( -0.05-, 0.05+ ), return ln((1+y)/(1-y)) BigNumber v = (new BigNumber("1")), y2 = y * y, t = y2, z = t / (new BigNumber("3")); for (BigNumber i = new BigNumber("3"); CompareNumber.Compare(z, new BigNumber("0")) != 0; z = (t *= y2) / (i += new BigNumber("2"))) { v += z; } return v * y * (new BigNumber("2")); }
static void Main(string[] args) { BigNumber num = new BigNumber((double).0000201, NumberType2.irrational); }
public static BigNumber Log10(BigNumber x) { return Log(x) / ln10; }
public static BigNumber Log(BigNumber x) { if (CompareNumber.Compare(x, new BigNumber("0")) == -1 || CompareNumber.Compare(x, new BigNumber("0")) == 0) throw new ArgumentException("Must be positive"); int k = 0, l = 0; for (; CompareNumber.Compare(x, new BigNumber("1")) == 1; k++) x /= new BigNumber("10"); for (; CompareNumber.Compare(x, new BigNumber("0.1")) == -1; k--) x *= new BigNumber("10"); // ( 0.1, 1 ] for (; CompareNumber.Compare(x, new BigNumber("0.9047")) == -1; l--) x *= new BigNumber("1.2217"); // [ 0.9047, 1.10527199 ) return k * ln10 + l * lnr + Logarithm((x - new BigNumber("1")) / (x + new BigNumber("1"))); }
public static BigNumber Cos(BigNumber x) { int precision = 30; return TaylorFunction.Cosine(x, precision); }
public static BigNumber Exp(BigNumber x) { int precision = 30; return TaylorFunction.Exp(x, precision); }
public static BigNumber Pow(BigNumber Num1,BigNumber Num2,int precision = 30) { //Num1为底,Num2为幂次 //precision默认为保留30位小数 if (Num2 > 0) { return Num1.Power(Num2, precision); } else if (Num2 <0) { Num2 = 0 - Num2; return 1 / Num1.Power(Num2, precision); } else { return 1; } }
public static BigNumber Sqrt(BigNumber Num) { if (Num <= 0) { return 0; } else { //return Num.Power(0.5, 30); return DecimalPowerCalculator.Sqrt(Num, 30); } }
public static BigNumber[,] MatPlus(BigNumber[,] mat1, BigNumber[,] mat2) {//矩阵加法 int len11 = mat1.GetLength(0); int len12 = mat1.GetLength(1); int len21 = mat2.GetLength(0); int len22 = mat2.GetLength(1); if (len11 == len21 && len12 == len22) { BigNumber[,] a = new BigNumber[len11, len12]; for (int i = 0; i < len11; i++) { for (int j = 0; j < len22; j++) a[i, j] = 0; } for (int i = 0; i < len11; i++) { for (int j = 0; j < len12; j++) { a[i, j] = mat1[i, j] + mat2[i, j]; } } return a; } else { return null; } }
public static BigNumber Double2Big(Double x_bignumber) { string NumberStr = x_bignumber.ToString().Trim(); int E_position = -1; int IsNegative = 0; int ScientificNotation = 0; string ScientificNumber; BigNumber result = new BigNumber("0"); string Scientificupper; //0为正,1为负 for (int i = 0; i < NumberStr.Length; i++) { if (NumberStr[i] == 'E' || NumberStr[i] == 'e') { E_position = i; } } if (E_position != -1) { ScientificNotation = NumberStr.Length - E_position - 1 - 1; ScientificNumber = NumberStr.Substring(E_position + 1 + 1, ScientificNotation); Scientificupper = NumberStr.Substring(0, E_position - 1); if (NumberStr[E_position + 1] == '-') { IsNegative = 1; result = new BigNumber("-1") * new BigNumber(Scientificupper) * (new BigNumber("10").Power(new BigNumber(ScientificNumber))); return result; } else { result = new BigNumber("1") * new BigNumber(Scientificupper) * (new BigNumber("10").Power(new BigNumber(ScientificNumber))); return result; } } else { result = new BigNumber(NumberStr); return result; } }
public static string round(string number, int digits, int type) { //type为0时四舍五入,1为ground,2为ceiling int NumOriginLen = number.Length; char[] digit_dot = { '.' }; string[] NumberBroken; NumberBroken = number.Split(digit_dot); if (digits < 0) { digits = 0; } if (NumberBroken[0].Length == NumOriginLen) { if (digits <= 0) { return number; } else { return NumberBroken[0] + ".".PadRight(digits + 1, '0'); } } else { string decimal_part = " "; BigNumber zero_point_one = new BigNumber("0.1"); BigNumber one = new BigNumber("1"); if (NumberBroken[1].Length > digits) { if (type == 1) { decimal_part = NumberBroken[1].Substring(0, digits); } else if (type == 2) { BigNumber carry = new BigNumber(digits.ToString()); carry = zero_point_one.Power(carry, 200); BigNumber number_changed = new BigNumber(number); number_changed = number_changed + carry; if (digits <= 0) { return number_changed.ToString().Substring(0, NumberBroken[0].Length); } return number_changed.ToString().Substring(0, NumOriginLen - (NumberBroken[1].Length - digits)); } else { if (Convert.ToInt32(NumberBroken[1].Substring(digits, 1)) > 4) { BigNumber carry = new BigNumber(digits.ToString()); carry = zero_point_one.Power(carry, 200); BigNumber number_changed = new BigNumber(number); number_changed = number_changed + carry; return number_changed.ToString().Substring(0, NumOriginLen - (NumberBroken[1].Length - digits)); } else { decimal_part = NumberBroken[1].Substring(0, digits); } } } else { decimal_part = NumberBroken[1].PadRight(digits, '0'); } if (decimal_part == "") { return NumberBroken[0]; } return NumberBroken[0] + '.' + decimal_part; } }