2011-02-05 4 views
0

я этот кусок кодаC++ грех() возвращает неверные результаты

bool Position::HasInLine(const Unit * const target, float distance, float width) const 
{ 
    if (!HasInArc(M_PI, target) || !target->IsWithinDist3d(m_positionX, m_positionY, m_positionZ, distance)) 
     return false; 
    width += target->GetObjectSize(); 
    float angle = GetRelativeAngle(target); 
    float absSin = abs(sin(angle)); 
    return abs(sin(angle)) * GetExactDist2d(target->GetPositionX(), target->GetPositionY()) < width; 
} 

Проблема я столкнулся в том, что, когда я отладки с помощью GDB и попытаться «р sin (угол)» возвращает странные значения - для угол 1.51423 он утверждает, что sin = 29 (так что да, я вкладываю в радианы :-)). Более странно то, что когда я пытаюсь «p absSin», он всегда возвращает 0, и да, я был на следующей строке, поэтому строка «float absSin = abs (sin (angle)) уже была выполнена. В оригинале не было даже cmath, но M_PI const возвращал правильное значение, хотя я добавил #include в начале файла .cpp, чтобы убедиться, но ничего не изменилось.

Если это помогает, им с использованием ядра linux 2.6.26-2-xen-amd64 Любые идеи?

+1

когда дает грех что-то> 1, то что-то * действительно * сломана в вашей установке. Может, кто-то написал собственную функцию греха, которая скрывает оригинальную? вы можете использовать 'nm' в ваших объектных и библиотечных файлах для поиска файлов-нарушителей. – Rudi

ответ

1

разве вы не должны использовать фабрики, а не абс? abs принимает ints и возвращает только ints

+0

http://www.cplusplus.com/reference/clibrary/cmath/abs/ говорит иначе o_O – Dragonkin

+0

@ Dragonkin, что вы включаете? или что ??????? – UmmaGumma

+0

@ Dragonkin в переопределяется и работает только для ints. – UmmaGumma

3

Функция abs (как определено в cstdlib) всегда принимает целое число и возвращает целое число. При работе с double s вместо этого вы должны использовать fabs.

Другая версия abs определена в cmath (#include <cmath>). Он перегружен, чтобы принимать (и возвращать) целые и двойные числа.

Возможно, вы захотите дважды проверить, какую версию вы используете.

1

«для угла 1.51423 говорится, что грех = 29»

Это, скорее всего, ошибка наблюдения, не ошибка функции греха.

Результат должен быть в диапазоне от -1 до +1.

Приветствия & НТН.,

Смежные вопросы