C # тригонометрические функции / математические функции - PullRequest
0 голосов
/ 15 декабря 2018

Я пишу класс, который должен вычислять углы (в градусах), после долгих попыток я не получаю его.

Когда r = 45 & h = 0, сумма должна бытьоколо 77,14 °

но возвращается NaN - почему?Я знаю, что это должно быть что-то с методом Math.Atan и недопустимым значением.

Мой код:

    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.

РЕДАКТИРОВАТЬ: Хорошо, моя проблема заключалась в том, что у меня была ошибка синтаксического анализа при создании объекта или получении пользовательского ввода, очевидно, решил ее случайно.Ofc Я должен добавить простое исключение, как сказал Ник Dechiara.Большое спасибо за быстрый ответ, я ценю это.

EDIT2: Исключением в моем листе Excel является:

if(h < 2) {h = 2}

, так что это все объясняет, и я не обращал на это вниманиявсе.Еще раз спасибо за все ответы.

int r = 45, h = 2;
sum = 77.14°

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Определенно разбейте выражение на что-то вроде

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; в начале кода, чтобы сократить такие математические выражения.

0 голосов
/ 15 декабря 2018

Хороший подход к устранению проблем такого рода - разбить уравнение на более мелкие части, чтобы его было легче отлаживать.

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, так как это нарушает вашу математику здесь.

...