在C#中计算多维数据集根的另一种方法

时间:2015-03-02 19:17:35

标签: c# .net math

在我的计算器中,我使用这些语句来计算平方根和立方根。

case "sqrt root":
        result = Math.Sqrt(number1);
break;
case "root":
     result = Math.Pow(number1, (1 / number2));
     //"for cubic root" - Math.pow(number, (1/ 3))
break;

我对Math.Pow不太熟悉。还有另一种计算立方根的方法吗?使用Math.Sqrt?

4 个答案:

答案 0 :(得分:15)

您需要使用浮点除法(执行1/3执行整数除法,这不会起作用)

result = Math.Pow(number, (1.0 / 3.0));

但除此之外,没有立方根

的内置函数

答案 1 :(得分:2)

  

我在某处看到了如何用math.sqrt做立方根,所以我想也许有人会在这里知道或者告诉我另一种方法,如何做立方根。 - user3841611

在数学上,您可以使用Sqrt来获取多维数据集根目录:

x 1/3 = x 1/4 * x 1/16 * x 1/64 * x 1/256 * x 1/1024 * x 1/4096 * x 1/16384 *。 ..

这来自1/3的binary representation以及:

  • Sqrt(x)是x 1/2
  • Sqrt(Sqrt(x))是x 1/4
  • Sqrt(Sqrt(Sqrt(x)))是x 1/8 等..
  • Sqrt(Sqrt(Sqrt(Sqrt(x))))是x 1/16 等..

换句话说,你保持取数字的平方根并将每隔一个值相乘得到x 1/3 。一旦值停止变化(浮点精度有限,所以最终产品不会改变),你将有非常接近 x 1/3 的东西

如果你愿意,我会发布一些伪代码。

答案 2 :(得分:0)

通过乘以嵌套的第四根来查找多维数据集根看起来不错,但是断言失败。

    static double Sqrt(double x)
    {
        if (x < 0)
            throw new OverflowException("Cannot calculate square root from a negative number");

        double epsilon = 0.0;
        double current = Math.Sqrt(x), previous;
        do
        {
            previous = current;
            if (previous == 0.0)
                return 0;
            current = (previous + x / previous) / 2;
        }
        while (Math.Abs(previous - current) > epsilon);
        return current;
    }

    // Mathematically, you can use Sqrt to get the cube root:
    // x1/3 = x1/4 * x1/16 * x1/64 * x1/256 * x1/1024 * x1/4096 * x1/16384 *...
    static double Cbrt(double value)
    {
        if (value.Equals(1.0))
            return value;

        double nextValue = Sqrt(Sqrt(value));
        return nextValue * Cbrt(nextValue);
    }

    public static void Main(string[] args)
    {
        string question = "Why does the cube root of {0:0.000} not equal between {1:0.000000000} and {2:0.000000000} ?";
        double value = 2.197, cbrt1 = Cbrt(value), cbrt2 = Math.Pow(value, 1.0 / 3.0), difference = Math.Abs(cbrt1 * .000000001);
        System.Diagnostics.Debug.Assert(Math.Abs(cbrt1 - cbrt2) > difference, string.Format(question, value, cbrt1, cbrt2));
        value = 125.0; cbrt1 = Cbrt(value); cbrt2 = Math.Pow(value, 1.0 / 3.0); difference = Math.Abs(cbrt1 * .000000001);
        System.Diagnostics.Debug.Assert(Math.Abs(cbrt1 - cbrt2) > difference, string.Format(question, value, cbrt1, cbrt2));
        value = 343.0; cbrt1 = Cbrt(value); cbrt2 = Math.Pow(value, 1.0 / 3.0); difference = Math.Abs(cbrt1 * .000000001);
        System.Diagnostics.Debug.Assert(Math.Abs(cbrt1 - cbrt2) > difference, string.Format(question, value, cbrt1, cbrt2));
    }

答案 3 :(得分:0)

.NET Core具有Math.Cbrt

result = Math.Cbrt(number);

.NET Framework 4.8中不提供此功能。