在C#中使用System.Math.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
这是一个递归值),我应该用什么来查找多维数据集根这样我得到4
(同时调试)而不是3.9999999999999996
?
这是{花括号语言}中的标准陷阱,包括C#,具有整数操作数的除法作为整数除法执行,而不是浮点除法。 它总是产生一个整数结果, 1 / 3
产生0.将任何数字提高到0的幂会产生1.0
您通过将其中一个操作数转换为double来强制进行浮点除法。 像1.0 / 3
或(double)integerVariable / 3
。
乘法的类似问题,但通常较少的陷阱,积分操作数产生一个冒险溢出的积分结果。 这反映了处理器的工作方式,它对这些操作有明确的指示,IMUL与FMUL和IDIV对FDIV。 后者因奔腾处理器中的错误而闻名:)
您可以尝试为立方根function运行此代码。
textBox2.Text = Math.Pow(Convert.ToDouble(textBox1.Text), 0.3333333333333333).ToString();
错误(顺便说一句,只有4E-16
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
。
上述就是C#学习教程:在C#中使用System.Math.Pow()方法查找数字的多维数据集根目录分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
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
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/950255.html