Leo 发表于 2014-5-13 14:04:00

代码评析(系列二)

      /// <summary>
      /// Cuberoot运算
      /// </summary>
      /// <param name="a">输入参数List,正确输入时仅含一个数据</param>
      /// <returns>返回运算结果</returns>
      public static BigDecimal Cuberoot(List<BigDecimal> a)
      {
            if (a.Count() != 1)
            {
                throw new Exception("cuberoot函数输入错误");
            }
            else
            {
                BigDecimal Num = BigDecimal.Simplify(a.First());

                //若Num的整数部分为零,则直接返回它本身
                if (Num.GetIntPart() == 0)
                {
                  return Num;
                }
                else
                {
                  //使用迭代法求立方根
                  //定义常数3
                  BigDecimal Three = new BigDecimal(3);

                  //定义计算结果和开立方数Y
                  BigDecimal Result = new BigDecimal(0);
                  BigDecimal Y = new BigDecimal(Num);

                  //先对阶数化简
                  Result.SetOrder(Y.GetOrder() / 3);
                  Y.SetOrder(Y.GetOrder() % 3);

                  BigDecimal CalculateEps = new BigDecimal("1e" + ((BigInteger.Abs(Y.GetIntPart()).ToString().Length + Y.GetOrder()) / 3 - BigDecimal.Accuracy).ToString());

                  //先限制乘法有效位数
                  BigDecimal.LimitMultiply = true;

                  //开始计算
                  BigDecimal X = new BigDecimal(1);
                  BigDecimal NewX = (X + X + Y / (X * X)) / Three;

                  while (BigDecimal.Abs((NewX - X)) > CalculateEps)
                  {
                        X = NewX;
                        NewX = (X + X + Y / (X * X)) / Three;
                  }

                  Result.SetIntPart(NewX.GetIntPart());
                  Result.SetOrder(Result.GetOrder() + NewX.GetOrder());
                  Result = BigDecimal.Simplify(Result);

                  //关闭限制乘法有效位数
                  BigDecimal.LimitMultiply = false;

                  return Result;
                }
            }
      }

以上,欢迎讨论。

daodao 发表于 2014-5-13 15:51:00

哎呀~这是我的代码……:#

Leo 发表于 2014-5-13 16:32:00

回复 2楼daodao的帖子

嘿嘿,不小心被你发现了。:itwn:

Leo 发表于 2014-5-15 08:57:00

好了,点评一下。
优点:
对参数做了必要的检查,代码条理还算清晰,
缺点:
圈复杂度还是有一点点的高,可以适当化简,提高代码可读性。
页: [1]
查看完整版本: 代码评析(系列二)