1

我正在写一个应该计算角度(以度为单位)的类,经过长时间的尝试我没有让它工作。

当 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°
4

2 回答 2

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并让代码运行,我们会看到ab都等于 0。这给了我们a / b = 0 / 0 = NaN最后一行。

现在我们可以问,为什么会这样?好吧,如果b你有h - r + r0 - 45 + 45计算结果为0,所以b变为 0。你的数学可能有错误。

在 的情况下a,我们有2 * h * r - h * h,它也计算为0

您可能 A)在您的方程式中有错误,或者 B)需要包含一个特殊情况 when h = 0,因为这会破坏您的数学。

于 2018-12-14T21:54:23.820 回答
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=0c=0。您可以考虑将最后一个表达式更改为

var sum = 180 / PI * Atan2(b , c);

b=0这将在和时返回一个值c=0

PS。此外,using static System.Math;在代码开头使用以缩短此类数学表达式。

于 2018-12-14T22:02:48.787 回答