我正在写一个应该计算角度(以度为单位)的类,经过长时间的尝试我没有让它工作。
When r = 45 & h = 0 sum should be around 77,14°
但它返回 NaN - 为什么?我知道它一定是与 Math.Atan-Method 相关的东西并且是无效值。
我的代码:
private int r = 0, h = 0;
public Schutzwinkelberechnung(int r, int h)
{
this.r = r;
this.h = h;
}
public double getSchutzwinkel()
{
double sum = 0;
sum = 180 / Math.PI * Math.Atan((Math.Sqrt(2 * h * r - (h * h)) - r * Math.Sin(Math.Asin((Math.Sqrt(2 * h * r)) / (2 * r)))) / (h - r + r * (Math.Cos(Math.Asin(Math.Sqrt(2 * h * r) / (2 * r))))));
return sum;
}
有人看到我的错误了吗?我从 Excel 工作表中得到了公式。
编辑:好的,我的问题是我在创建对象或获取用户输入时遇到解析错误,显然是偶然解决的。正如 Nick Dechiara 所说,Ofc 我必须添加一个简单的异常(exception)。非常感谢您的快速回复,非常感谢。
EDIT2:我的 Excel 工作表中的异常是:
if(h < 2) {h = 2}
所以这解释了一切,我根本没有注意。再次感谢所有的回答。
int r = 45, h = 2;
sum = 77.14°
最佳答案
调试此类问题的一个好方法是将等式分解成更小的部分,这样更容易调试。
double r = 45;
double h = 0;
double sqrt2hr = Math.Sqrt(2 * h * r);
double asinsqrt2hr = Math.Asin((sqrt2hr) / (2 * r));
double a = (Math.Sqrt(2 * h * r - (h * h)) - r * Math.Sin(asinsqrt2hr));
double b = (h - r + r * (Math.Cos(asinsqrt2hr)));
double sum = 180 / Math.PI * Math.Atan(a / b);
现在,如果我们在 sum
处放置一个断点并让代码运行,我们会看到 a
和 b
都等于零。这在最后一行为我们提供了 a/b = 0/0 = NaN
。
现在我们可以问,为什么会这样?那么在 b
的情况下,您有 h - r + r
,它是 0 - 45 + 45
,计算结果为 0
,所以 b
变为 0。你的数学可能有错误。
在 a
的情况下,我们有 2 * h * r - h * h
,它的计算结果也为 0
。
您可能要么 A) 在您的等式中有错误,要么 B) 需要包含一个特殊情况来表示 h = 0
,因为这会破坏您的数学运算。
关于C#三角函数/数学函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53787236/