代码之家  ›  专栏  ›  技术社区  ›  gkb

使用C中的System.Math.Pow()方法查找数字的立方根#

  •  8
  • gkb  · 技术社区  · 10 年前

    在编写一个程序时,我偶然发现在我的一个函数中找到了一个数的立方根。

    当我使用下面的代码时,我得到了一个不正确的立方体根值( 1 正在为打印 n = 64 ).

    public static void cubicPairs(double n)
    {
        double root = (System.Math.Pow(n, (1/3)));
        Console.WriteLine(root);
    }
    

    现在,在我将代码稍微更改为这个之后,

    public static void cubicPairs(double n)
    {
        double root = (System.Math.Pow(n, (1.0/3.0))); //Changed how second parameter is passed
        Console.WriteLine(root);
    }
    

    我得到了 root = 3.9999999999999996 (调试时)但方法正在打印 4 (这是正确的)。

    为什么这两个值之间存在差异,如果这与 System.Math.Pow() 方法(即, 1.0/3.0 这是一个递归值),我应该使用什么来查找立方体根,以便获得 4. (调试时)而不是 3.9999999999999996 ?

    5 回复  |  直到 10 年前
        1
  •  17
  •   Hans Passant    10 年前

    这是{花括号语言}(包括C#)中的标准陷阱,使用整数操作数的除法作为 整数 除法,而不是浮点除法。它总是产生整数结果, 1 / 3 生成0。将任何数字提高到0的幂会产生1.0

    通过将其中一个操作数转换为双倍,可以强制执行浮点除法。喜欢 1.0 / 3 (double)integerVariable / 3 .

    与乘法类似的问题,但通常不太像陷阱,整数操作数会产生溢出风险的整数结果。这反映了处理器的工作方式,它对这些操作有不同的指令,IMUL vs FMUL,IDIV vs FDIV。后一个因奔腾处理器中的一个错误而闻名:)

        2
  •  1
  •   CubeJockey Marco    8 年前

    您可以尝试为多维数据集根功能运行此代码。

    textBox2.Text = Math.Pow(Convert.ToDouble(textBox1.Text), 0.3333333333333333).ToString();
    
        3
  •  -1
  •   Sean Latham    10 年前

    错误(顺便说一下 4E-16 -400五分之一)是由浮点误差引起的。

    如果数字在某个阈值内,您可以通过四舍五入来规避此问题:

    public static void cubicPairs(double n)
    {
        double root = (System.Math.Pow(n, (1/3)));
        double roundedRoot = Math.Round(root);
    
        if (Math.Abs(roundedRoot - root) < VERY_SMALL_NUMBER)
            return roundedRoot;
        else
            return root;
    }
    

    哪里 VERY_SMALL_NUMBER 例如, 1e-10 .

        4
  •  -1
  •   seyed    6 年前
    public static void Main()
    {
        int a= int.Parse(Console.ReadLine());
        int sum=0;
    
        for(int i=0 ; i<= a ;i++)
        {
            for(int j=0 ; j<i ;j++)
            {
                sum =+ (i*i);
            }
            Console.WriteLine("Number is : {0} and cube of the {0} is :{1} \n",i,sum*i);
        }
    }
    
        5
  •  -2
  •   Zoe - Save the data dump Rakesh Patil    5 年前

    试试看

    Math.Ceiling(Math.Pow(n, (double)1 / 3));