В настоящее время я переписываю старый код C++ на C#. При выполнении некоторых тестов он не работал должным образом, и я начал отлаживать, и натолкнулся на нижнее, которое, по-видимому, не понял.Вложенная Math.Pow (...) действующая weird
Как я делаю много математики в классе и с помощью функции 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);
Который я ожидал бы оценить так же, как и q5, но это не так. q12 вместо этого оценивает до 4479508755225.0
Что не так с кодом?
Вы имеете в виду вложенные? – leppie
, кстати, 'Math.Pow' довольно медленный. Я бы предложил использовать 'double sqr (double d) {return d * d; } 'и' double 4thPow (double d) {return d * d * d * d; } '. – Vlad
Ты застрелил ногу. Это происходит при использовании имен переменных, таких как «q5» и «d23». Используйте лучшие имена. –