/// <summary> /// /重载:一个高精度数除以一个高精度数 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> public static BigNumber operator /(BigNumber a, BigNumber b) { BigNumber c = new BigNumber(); BigNumber temp = new BigNumber(); if (Comparer(a, Trans(0))) { return(c); } c.positive = a.positive * b.positive; a.positive = 1; b.positive = 1; temp = a; int times = 0, add = 0; int i, t, s, p; for (s = 0; a.value[s] == 0; s++) { ; } for (t = 0; b.value[t] == 0; t++) { ; } if (t - s > 0) { times = t - s; for (i = 59 - times; i >= 0; i--) { temp.value[i + times] = temp.value[i]; } for (i = 0; i < times; i++) { temp.value[i] = 0; } } p = 19 - t; for (i = t; p + i < 60; i++) { int k = 9; while ((temp - b * k).positive == -1 && k >= 0) { k--; } c.value[p + i] = k; temp = (temp - b * k) * 10; } c = (c + Trans(add)) * Math.Pow(10.0, times); if (c.zero(c)) { c.positive = 1; } return(c); }
/// <summary> /// 减半Taylor /// </summary> /// <param name="a"></param> /// <returns></returns> public BigNumber Taylor(BigNumber a) { int i = 0, count = 0; BigNumber two = new BigNumber(); //Trans(2); two.value[19] = 2; BigNumber ln2 = new BigNumber(); //0.69314 71805 59945 30941 72321 21458 17656 80718 // 20 24 25 29 30 34 35 39 40 44 45 49 50 54 55 59 ln2.value[23] = ln2.value[26] = ln2.value[39] = ln2.value[44] = ln2.value[46] = ln2.value[50] = ln2.value[58] = 1; ln2.value[41] = ln2.value[43] = ln2.value[45] = 2; ln2.value[22] = ln2.value[35] = ln2.value[42] = 3; ln2.value[24] = ln2.value[33] = ln2.value[38] = ln2.value[47] = 4; ln2.value[29] = ln2.value[30] = ln2.value[34] = ln2.value[48] = ln2.value[53] = 5; ln2.value[20] = ln2.value[52] = ln2.value[54] = 6; ln2.value[25] = ln2.value[40] = ln2.value[51] = ln2.value[57] = 7; ln2.value[27] = ln2.value[49] = ln2.value[55] = ln2.value[59] = 8; ln2.value[21] = ln2.value[31] = ln2.value[32] = ln2.value[37] = 9; if (!(a < two)) { do { a = a / 2; i++; } while (!(a < two)); } a = a - 1; BigNumber x = copy(a); BigNumber lnx = new BigNumber(); BigNumber temp1 = new BigNumber(); int n = 1; BigNumber temp = x / n; do { lnx = lnx + temp; count++; temp1 = x * a; x = invert(temp1); n++; temp = x / n; } while (!(temp.zero(temp))); BigNumber result = new BigNumber(); result = lnx + (ln2 * i); return(result); }
/// <summary> /// *重载:两个高精度数相乘 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> public static BigNumber operator *(BigNumber a, BigNumber b) { BigNumber c = new BigNumber(); if (a.zero(a) || b.zero(b)) { return(c); } int positive = a.positive * b.positive; a.positive = 1; b.positive = 1; BigNumber d = copy(b); int i, j; for (i = 59; i >= 0; i--) { if (i >= 20) //处理小数部分 { for (j = 0; j < i - 19; j++) { d.value[j] = 0; } for (j = i - 19; j < 60; j++) { d.value[j] = b.value[j - i + 19]; } c = c + (d * a.value[i]); } else //处理整数部分 { for (j = 0; j < 60 - 19 + i; j++) { d.value[j] = b.value[j + 19 - i]; } c = c + (d * a.value[i]); } } c.positive = positive; if (c.zero(c)) { c.positive = 1; } return(c); }
/// <summary> /// 迭代开根号 /// </summary> /// <param name="a"></param> /// <returns></returns> public BigNumber sqrt(BigNumber a) { BigNumber one = new BigNumber(); one.value[19] = 1; BigNumber x1 = new BigNumber(); BigNumber x2 = new BigNumber(); if (a.zero(a)) { return(a); } else { if (a > one) { x2 = a / 2; } else { x2 = a * 2; } do { x1 = copy(x2); x2 = (x1 + (a / x1)) / 2; } while (!(x2 - x1).zero(x2 - x1)); for (int i = 0; i < 60; i++) { if (x2.value[i] > 9) { x2.value[i] -= 10; x2.value[i + 1] += 1; } } return(x2); } }
/// <summary> /// +重载:两个高精度数相加 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> public static BigNumber operator +(BigNumber a, BigNumber b) { BigNumber c = new BigNumber(); int flag = a.positive * b.positive; if (flag == 1) { c.positive = a.positive; int carry = 0; for (int i = 59; i >= 0; i--) { c.value[i] = a.value[i] + b.value[i] + carry; if (c.value[i] > 9) { c.value[i] = c.value[i] - 10; carry = 1; } else { carry = 0; } } } else { if (abs(a) > abs(b)) { c.positive = a.positive; int borrow = 0; for (int i = 59; i >= 0; i--) { c.value[i] = a.value[i] - b.value[i] - borrow; if (c.value[i] >= 0) { borrow = 0; } else { c.value[i] += 10; borrow = 1; } } } else { c.positive = b.positive; int borrow = 0; for (int i = 59; i >= 0; i--) { c.value[i] = b.value[i] - a.value[i] - borrow; if (c.value[i] >= 0) { borrow = 0; } else { c.value[i] += 10; borrow = 1; } } } } if (c.zero(c)) { c.positive = 1; } return(c); }
/// <summary> /// e^x高精度运算 /// </summary> /// <param name="a"></param> /// <returns></returns> public BigNumber exp(BigNumber a) { BigNumber e = new BigNumber(); int i; for (i = 0; i < 18; i++) { e.value[i] = 0; } e.value[32] = e.value[40] = 0; e.value[21] = e.value[25] = e.value[46] = 1; e.value[19] = e.value[23] = e.value[27] = e.value[35] = e.value[41] = e.value[49] = e.value[52] = e.value[59] = 2; e.value[36] = e.value[38] = e.value[47] = 3; e.value[29] = e.value[33] = e.value[44] = e.value[53] = 4; e.value[30] = e.value[34] = e.value[37] = e.value[48] = e.value[57] = 5; e.value[39] = e.value[50] = e.value[51] = 6; e.value[20] = e.value[43] = e.value[45] = e.value[55] = e.value[56] = e.value[58] = 7; e.value[22] = e.value[24] = e.value[26] = e.value[28] = e.value[42] = 8; e.value[31] = e.value[54] = 9; //Trans(2.7182818284590452353602874713526624977572); BigNumber Integer = new BigNumber(); BigNumber Decimal = new BigNumber(); for (i = 0; i < 20; i++) { Integer.value[i] = a.value[i]; } for (i = 20; i < 60; i++) { Decimal.value[i] = a.value[i]; } BigNumber temp = Trans(1); BigNumber temp1 = copy(Decimal); BigNumber result = Trans(1); i = 1; if (a.zero(a)) { return(Trans(1)); } else if (a.positive == 1) { while (!Integer.zero(Integer)) { temp = temp * e; Integer = Integer - 1; } while (!temp1.zero(temp1)) { result = result + temp1; i++; temp1 = temp1 * Decimal / i; } result = result * temp; return(result); } else { while (!Integer.zero(Integer)) { temp = temp * e; Integer = Integer - 1; } while (!temp1.zero(temp1)) { result = result + temp1; i++; temp1 = temp1 * Decimal / i; } result = 1 / (temp * result); return(result); } }