2011-02-05 140 views
0

我有这一段代码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罪(角度)”则返回怪异值 - 对于角度1.51423它说,sin = 29(所以是的,我放入弧度:-))。更奇怪的是,当我尝试“p absSin”时,它总是返回0,并且是,我在下一行,所以“float absSin = abs(sin(angle))”行已经完成。 原来这里甚至没有包含cmath,但是M_PI常量返回了正确的值,尽管我在.cpp文件的开头添加了#include以确保但没有任何更改。

如果有帮助,即时通讯使用Linux内核2.6.26-2-xen-amd64 任何想法?

+1

当罪产量东西> 1,则事情是真的* *打破了您的设置。也许有人写了一个隐藏原始函数的自己的sin函数?你可以在你的对象和库文件上使用`nm`来搜索违规文件。 – Rudi 2011-02-05 10:40:35

回答

1

你不应该使用晶圆厂而不是abs? abs取整并且仅返回整数

+0

http://www.cplusplus.com/reference/clibrary/cmath/abs/否则说o_O – Dragonkin 2011-02-05 10:35:11

3

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

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

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

1

“的角度1.51423它指出罪= 29”

这是最有可能的观察错误,不正弦函数的错误。

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

干杯&心连心,