C ++ sin()返回不正确的结果

时间:2011-02-05 10:28:17

标签: c++ sin

我有这段代码

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 const返回了正确的值,虽然我在.cpp文件的开头添加了#include以确保,但没有任何改变。

如果有帮助,我使用linux内核2.6.26-2-xen-amd64 有什么想法吗?

3 个答案:

答案 0 :(得分:3)

函数abs(在cstdlib中定义)总是取整数并返回一个整数。在处理double时,您应该使用fabs代替。

另一版abscmath#include <cmath>)中定义。它被重载以接受(并返回)整数和双精度。

您可能希望仔细检查您正在使用的版本。

答案 1 :(得分:1)

你不应该使用晶圆厂,而不是abs吗? abs占用整数并仅返回整数

答案 2 :(得分:1)

“对于角度1.51423,它表明sin = 29”

这很可能是观察错误,而不是sin函数的错误。

结果应在-1到+1范围内。

干杯&amp;第h。,