示例#1
0
 internal static BigNumber Power(BigNumber bigNumber, BigNumber value)
 {
     return(Power(bigNumber, value, bigNumber.DecimalPart.Count + 1));
 }
示例#2
0
 /// <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>());
     }
 }
示例#3
0
        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;
            }
        }
示例#4
0
 private static BigNumber Sqrt(BigNumber value)
 {
     throw new NotImplementedException();
 }
示例#5
0
 public static BigNumber Log10(BigNumber x)
 {
     return(Log(x) / ln10);
 }
示例#6
0
        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);
            }
        }
示例#7
0
        public static BigNumber Exp(BigNumber x)
        {
            int precision = 30;

            return(TaylorFunction.Exp(x, precision));
        }
示例#8
0
        public static BigNumber Cos(BigNumber x)
        {
            int precision = 30;

            return(TaylorFunction.Cosine(x, precision));
        }
示例#9
0
        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);
            }
        }
示例#10
0
 /// <summary>除</summary>
 public static BigNumber Division(BigNumber one, BigNumber two)
 {
     return(Division(one, two, 50));
 }
示例#11
0
        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)));
        }