嵌套的 Math.Pow(...) 表现异常

4

我正在将一些旧的C++代码重写为C#。在运行一些测试时,它没有按照预期工作,我开始进行调试,并遇到了下面的问题,我似乎无法解决。

因为我在类中进行了很多数学计算,并经常使用Math.Pow函数,所以我创建了一个快捷方法:

public double pow(double d, double p)
{
   return Math.Pow(d,p);
}

那么我有一行代码如下,它使用了这个方法很多次:

double y = pow((pow(d12, 2) + pow(d13, 2) + pow(23, 2)), 2) - (2.0 * (pow(d12, 4) + pow(d13, 4) + pow(d23, 4)));

这行代码没有得到预期的结果,所以我开始将其分解成更小的部分进行计算......例如减号前面的值应该等于q5:

double q1 = pow(d12, 2);
double q2 = pow(d13, 2);
double q3 = pow(d23, 2);
double q4 = q1 + q2 + q3;
double q5 = pow(q4, 2);

在这些代码行后,q5 的值为 8775553070736.0。

接着我尝试将长行分成两部分,第一部分应该与上述 5 行相等,只是写成了一行:

double q12 = pow((pow(d12, 2) + pow(d13, 2) + pow(23, 2)), 2);

我原以为q12的值与q5相同,但实际上并不是这样的。q12的值为4479508755225.0

代码有什么问题吗?


顺便提一句,Math.Pow 很慢。我建议使用 double sqr(double d) { return d * d; }double fourthPow(double d) { return d*d*d*d; } - Vlad
2
你自己给自己挖了一个坑。当你使用像“q5”和“d23”这样的变量名时,就会发生这种情况。请使用更好的变量名。 - Hans Passant
1
我不确定pow()的内部工作原理,但我怀疑d12*d12比pow(d12,2)更快。 - n8wrl
谢谢你的性能提示,弗拉德 - 我想我会立即进行更改。 确实,汉斯 - 名称会更好,但我需要很多不同的变量,字母后面的数字可以帮助我看到变量代表什么。根据下面答案中建议的更改VS号码高亮显示可能会有很大帮助 :) - Knirkegaard
1个回答

6

为什么你会有这个期望:

pow(d23, 2)

与……相同

pow(23, 2)

小贴士:在VS中,始终将数字的默认颜色(黑色)更改为其他颜色(我喜欢红色)。


我知道我只是错过了一个括号或其他什么,因为我盯着它看太久了,没能发现...但确实 - 那就是我错过的错误。我会接受你的答案,因为我被允许这样做。谢谢。 - Knirkegaard
谢谢你的提示,我会这样做的。 - Knirkegaard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接