在编写程序时,我遇到了在我的一个函数中找到数字的立方根.
当我使用下面的代码时,我得到了一个不正确的多维数据集根值(1正在打印n = 64).
public static void cubicPairs(double n)
{
double root = (System.Math.Pow(n, (1/3)));
Console.WriteLine(root);
}
Run Code Online (Sandbox Code Playgroud)
现在我把代码稍微改成了这个,
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);
}
Run Code Online (Sandbox Code Playgroud)
我得到root = 3.9999999999999996(调试时),但方法是打印4(这是正确的).
为什么这两个值之间存在差异,如果这与方法的第二个参数有关System.Math.Pow()(即,1.0/3.0这是一个递归值),我应该使用什么来查找多维数据集根以便我得到4(在调试时)而不是3.9999999999999996?
Han*_*ant 13
这是{大括号语言}中的标准陷阱,包括C#,具有整数操作数的除法作为整数除法执行,而不是浮点除法.它总是产生一个整数结果,1 / 3产生0.将任何数字提高到0的幂会产生1.0
通过将其中一个操作数转换为double来强制浮点除法.喜欢1.0 / 3或(double)integerVariable / 3.
乘法的类似问题,但通常较少的陷阱,积分操作数产生一个冒险溢出的积分结果.这反映了处理器的工作方式,它对这些操作有明确的指示,IMUL与FMUL和IDIV对FDIV.后者因奔腾处理器中的错误而闻名:)