2012-06-01 1 views
4

В настоящее время я переписываю старый код 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

Что не так с кодом?

+0

Вы имеете в виду вложенные? – leppie

+0

, кстати, 'Math.Pow' довольно медленный. Я бы предложил использовать 'double sqr (double d) {return d * d; } 'и' double 4thPow (double d) {return d * d * d * d; } '. – Vlad

+2

Ты застрелил ногу. Это происходит при использовании имен переменных, таких как «q5» и «d23». Используйте лучшие имена. –

ответ

6

Почему вы ожидаете:

pow(d23, 2) 

быть такой же, как

pow(23, 2) 

?

PROTIP: IN VS, всегда меняйте цвет номеров по умолчанию (черный), на что-то еще (мне нравится красный).

+0

Я знал, что просто пропустил паратез или что-то в этом роде, и не мог его увидеть, так как я слишком долго смотрел на него ... но на самом деле - это была ошибка I пропущенный. Примите ваш ответ, как мне разрешено. Спасибо – Knirkegaard

+0

Это происходит :) См. Мое редактирование. – leppie

+0

Спасибо за этот совет, а также - сделаем это. – Knirkegaard