在C#中使用System.Math.Pow()方法查找数字的多维数据集根目录

时间:2014-09-09 11:49:03

标签: c# pow

在编写程序时,我遇到了在我的一个函数中找到数字的立方根。

当我使用下面的代码时,我得到的多维数据集根目录值不正确(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是一个递归值),我应该使用什么找到cube root,这样我得到4(在调试时)而不是3.9999999999999996

5 个答案:

答案 0 :(得分:13)

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

通过将其中一个操作数转换为double来强制进行浮点除法。与1.0 / 3(double)integerVariable / 3一样。

与乘法类似的问题,但通常较少的陷阱,积分操作数产生一个冒险溢出的积分结果。这反映了处理器的工作方式,它对这些操作有明确的指示,IMUL与FMUL和IDIV对FDIV。后者因奔腾处理器中的错误而闻名:)

答案 1 :(得分:1)

您可以尝试为立方根功能运行此代码。

textBox2.Text = Math.Pow(Convert.ToDouble(textBox1.Text), 0.3333333333333333).ToString();

答案 2 :(得分:0)

错误(顺便说一下,只有4E-16 - 400个quintillthth)是由浮点错误引起的。

如果数字在某个阈值范围内,您可以通过舍入数字来避免这种情况:

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

答案 3 :(得分:0)

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);
    }
}

答案 4 :(得分:0)

尝试

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