2009-12-24 5 views
0

Вот моя проблема (C#):Math.atan2 или экземпляр класса проблемы в C#

double Y = 0.0; 
double X = -21.0; 

double q1_Test = Math.Atan2(0.0, -21.0);    // gives Math.Pi 
double q1_Test2 = Math.Atan2((double)Y, (double)X); // gives Math.Pi 

double w1 = <SomeclassInstanceGlobalHere>.getW1(); // This is a class which updates a variable 
double w2 = <SomeclassInstanceGlobalHere>.getW2(); // This is a class which updates a variable 

double q1 = Math.Atan2(w2, w1);    // ** gives -Math.Pi ** ??? 
//w2 shows 0.0 and w1 shows -21.0 

Когда я получаю значение из другого класса, значение переменного равна 0,0 и -21.0 соответственно. Он также отображается в среде IDE при отладке. Что здесь не так?

+0

Это тот же ответ. Используйте modulo math при работе с углами. –

ответ

3

w2 должно быть на самом деле -0,0, который отформатирован как 0

Следующий блог показывает, как вы можете проверить это (Decimal.GetBits (значение)): http://blogs.msdn.com/bclteam/archive/2006/10/12/decimal-negative-zero-representation-lakshan-fernando.aspx

+0

Но тогда то же самое должно было произойти с double q1_Test2 = Math.Atan2 ((double) Y, (double) X); // дает Math.Pi – Rick2047

+0

Math.Atan2 (0.0, -21.0) дает pi, Math.Atan2 (-0.0, -21.0) дает -pi. Может быть, похоже, что это «не должно» произойти, но, как указывает Питер, они технически одинакового угла. –

+0

Знак q1 имеет значение для дальнейших расчетов. Посмотрим, смогу ли я что-нибудь с этим сделать ... :( – Rick2047

2

Обратите внимание, что - Math.PI и Math.PI эквивалентны для целей тригонометрии. Почти всегда очень плохой идеей сравнивать углы, как если бы они были двойниками. См. Расширенное обсуждение SO: Averaging angles... Again