我正在写一个应该计算角度(以度为单位)的类,经过长时间尝试后我仍然无法使用它。
当r = 45&h = 0时,总和应为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)所说,我不得不添加一个简单的例外情况。非常感谢您的快速回复,谢谢。
EDIT2:我的Excel工作表中的例外是:
if(h < 2) {h = 2}
所以这说明了一切,我一点也不注意。再次感谢您提供所有答案。
int r = 45, h = 2;
sum = 77.14°
答案 0 :(得分:6)
调试这类问题的一种好方法是将方程式分解成较小的部分,以便于调试。
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
的{{1}},其值为0 - 45 + 45
,因此0
变为0。您的数学可能有错误在那里。
对于b
,我们有a
,它的计算结果也为2 * h * r - h * h
。
您可能是A)方程式有误,或者B)0
时需要包含特殊情况,因为这在这里破坏了数学。
答案 1 :(得分:0)
肯定会破坏像这样的表达式
var a = Asin(Sqrt(2 * h * r) / (2 * r));
var b = Sqrt(2 * h * r - h * h) - r * Sin(a);
var c = h - r + r * Cos(a);
var sum = 180 / PI * Atan(b / c);
,您将找到b=0
和c=0
。您可以考虑将最后一个表达式更改为
var sum = 180 / PI * Atan2(b , c);
它将在b=0
和c=0
时返回一个值。
PS。另外,在代码开头使用using static System.Math;
可以缩短此类数学表达式。