internal static BigNumber Power(BigNumber bigNumber, BigNumber value) { return(Power(bigNumber, value, bigNumber.DecimalPart.Count + 1)); }
/// <summary>获取第一个除数</summary> static List <int> GetFirstDiv(BigNumber value, ref List <int> div, ref int index) { //这里有待加入对0.02和0.002的考虑 if (value.IntPart.Count == 1 && value.IntPart[0] == 0) { List <int> result = new List <int>(); result.Add(0); while (true) { if (value.DecimalPart[index] != 0) { for (int i = 0; i < index / 2; i++) { result.Add(0); } //0.005 if (index % 2 == 0) { div.Add(value.DecimalPart[index]); if (index + 1 < value.DecimalPart.Count) { div.Add(value.DecimalPart[index + 1]); } else { div.Add(0); } } //0.05 else { div.Add(value.DecimalPart[index]); } index++; break; } index++; if (index == value.DecimalPart.Count) { break; } } index++; return(result); } else { //如果是偶数则第一次取两位 if (value.IntPart.Count % 2 == 0) { div = value.IntPart.GetRange(0, 2); index = 2; } //是奇数则只取一位 else { div = value.IntPart.GetRange(0, 1); index = 1; } return(new List <int>()); } }
public static void NAProcess(DataGridView dataGridView1, string Cols, string type, RichTextBox richTextBox1, ComboBox comboBox_user_defined, TextBox textBox_user_defined) { char [] separator = { ',' }; string [] AllCols = Cols.Split(separator); List <int> ColsNeedRemove = new List <int>(); int NACount = 0; //计算缺失值数量 DataTable dt = dataGridView1.DataSource as DataTable; richTextBox1.AppendText("缺失值处理:\r\n"); richTextBox1.AppendText(" 处理方式: " + type + "\r\n"); richTextBox1.Select(); //让RichTextBox获得焦点 richTextBox1.Select(richTextBox1.TextLength, 0); //将插入符号置于文本结束处 richTextBox1.ScrollToCaret(); BigNumber Mean = 0; BigNumber Sum = 0; foreach (string Col in AllCols) { int StartCount = 0; //从第一个非空值开始计数 NACount = 0; Sum = 0; if (comboBox_user_defined.Text == "平均值") { string [] Numbers = Tabulation.ReadVector(MainForm.MainDT, Convert.ToInt32(Col) - 1).ToArray(); int NumCounts = 0; foreach (string Num in Numbers) { if (Tabulation.IsStrDouble(Num)) { Sum += Convert.ToDouble(Num); NumCounts++; } } Mean = Sum / NumCounts; } for (int i = dataGridView1.Rows.Count - 2; i >= 0; i--) { //倒着数,从后往前数 if (StartCount == 0 && dataGridView1.Rows[i].Cells[Convert.ToInt32(Col) - 1].Value.ToString().Trim() != "") { StartCount = 1; continue; } if (StartCount == 1 && dataGridView1.Rows[i].Cells[Convert.ToInt32(Col) - 1].Value.ToString().Trim() == "") { //遇到缺失值了 if (type == "计算缺失值个数") { NACount++; } else if (type == "删除整行") { NACount++; //dt.Rows.RemoveAt(i); ColsNeedRemove.Add(i); } else if (type == "替换为特定值") { if (comboBox_user_defined.Text == "平均值") { dataGridView1.Rows[i].Cells[Convert.ToInt32(Col) - 1].Value = Mean.ToString(); } else if (comboBox_user_defined.Text == "自定义值") { dataGridView1.Rows[i].Cells[Convert.ToInt32(Col) - 1].Value = textBox_user_defined.Text; } NACount++; } } } if (StartCount != 0) { richTextBox1.AppendText(" " + "第" + Col + "列" + "缺失值个数: " + NACount.ToString() + "\r\n"); richTextBox1.Select(); //让RichTextBox获得焦点 richTextBox1.Select(richTextBox1.TextLength, 0); //将插入符号置于文本结束处 richTextBox1.ScrollToCaret(); } } richTextBox1.AppendText("\r\n"); if (type == "删除整行") { ColsNeedRemove = ColsNeedRemove.Distinct().ToList(); ColsNeedRemove.Sort(); int [] SequenceRemove = ColsNeedRemove.ToArray(); for (int i = SequenceRemove.Length - 1; i >= 0; i--) { dt.Rows.RemoveAt(SequenceRemove[i]); } dataGridView1.DataSource = dt; } }
private static BigNumber Sqrt(BigNumber value) { throw new NotImplementedException(); }
public static BigNumber Log10(BigNumber x) { return(Log(x) / ln10); }
static int ComparePlus(BigNumber one, BigNumber two) { BigCalculate.RemoveStartZero(one.IntPart); BigCalculate.RemoveStartZero(two.IntPart); int minDecimalLength = one.DecimalPart.Count < two.DecimalPart.Count ? one.DecimalPart.Count : two.DecimalPart.Count; //通过正数的长短比较 if (one.IntPart.Count > two.IntPart.Count) { return(1); } else if (one.IntPart.Count < two.IntPart.Count) { return(-1); } else { //从最高位依次比较 for (int i = 0; i < one.IntPart.Count; i++) { if (one.IntPart[i] > two.IntPart[i]) { return(1); } else if (one.IntPart[i] < two.IntPart[i]) { return(-1); } } //比较小数部分,行判断是否有小数位 if (one.DecimalPart.Count == 0 && two.DecimalPart.Count != 0) { return(-1); } else if (one.DecimalPart.Count != 0 && two.DecimalPart.Count == 0) { return(1); } else if (one.DecimalPart.Count == 0 && two.DecimalPart.Count == 0) { return(0); } else { for (int i = 0; i < minDecimalLength; i++) { if (one.DecimalPart[i] > two.DecimalPart[i]) { return(1); } else if (one.DecimalPart[i] < two.DecimalPart[i]) { return(-1); } } if (one.DecimalPart.Count > two.DecimalPart.Count) { return(1); } else if (one.DecimalPart.Count < two.DecimalPart.Count) { return(-1); } } return(0); } }
public static BigNumber Exp(BigNumber x) { int precision = 30; return(TaylorFunction.Exp(x, precision)); }
public static BigNumber Cos(BigNumber x) { int precision = 30; return(TaylorFunction.Cosine(x, precision)); }
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); } }
/// <summary>除</summary> public static BigNumber Division(BigNumber one, BigNumber two) { return(Division(one, two, 50)); }
internal static BigNumber Division(BigNumber one, BigNumber two, int precision) { List <int> oneInt = new List <int>(); List <int> oneDecimal = new List <int>(); oneInt.AddRange(one.IntPart); oneDecimal.AddRange(one.DecimalPart); List <int> twoText = new List <int>(); twoText.AddRange(two.IntPart); twoText.AddRange(two.DecimalPart); RemoveStartZero(twoText); //将15/2.3 移位为 150/23 //DecimalLength for (int i = 0; i < two.DecimalPart.Count; i++) { if (oneDecimal.Count != 0) { oneInt.Add(oneDecimal[0]); oneDecimal.RemoveAt(0); } else { oneInt.Add(0); } } List <int> resultInt = new List <int>(); List <int> resultDecimal = new List <int>(); int index = twoText.Count < oneInt.Count ? twoText.Count - 1 : oneInt.Count - 1; List <int> div = oneInt.GetRange(0, index + 1); //正数部分的除法 while (true) { resultInt.Add(Division(div, twoText)); div = IntMinus(div, Multiply(twoText, new List <int> { resultInt[resultInt.Count - 1] }), 0); index++; if (index >= oneInt.Count) { break; } div.Add(oneInt[index]); } index = 0; //小数部分的除法 while (true) { //满足精度后退出 if (resultDecimal.Count >= precision) { break; } if (index >= oneDecimal.Count) { div.Add(0); } else { div.Add(oneDecimal[index]); } int r = Division(div, twoText); resultDecimal.Add(r); div = IntMinus(div, Multiply(twoText, new List <int> { r }), 0); index++; } return(new BigNumber(resultInt, resultDecimal, !(one.IsPlus ^ two.IsPlus))); }