C ++ sin () возвращает неверные результаты - PullRequest
0 голосов
/ 05 февраля 2011

у меня есть этот кусок кода

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

Если это поможет, я использую ядро ​​Linux 2.6.26-2-xen-amd64 Есть идеи?

Ответы [ 3 ]

3 голосов
/ 05 февраля 2011

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

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

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

1 голос
/ 05 февраля 2011

"для угла 1.51423 говорится, что sin = 29"

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

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

Приветствия и hth.,

1 голос
/ 05 февраля 2011

не должны ли вы использовать потрясающие, а не абс? abs принимает целые числа и возвращает только целые числа

...