我有这段代码
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 有什么想法吗?
答案 0 :(得分:3)
函数abs
(在cstdlib
中定义)总是取整数并返回一个整数。在处理double
时,您应该使用fabs
代替。
另一版abs
在cmath
(#include <cmath>
)中定义。它被重载以接受(并返回)整数和双精度。
您可能希望仔细检查您正在使用的版本。
答案 1 :(得分:1)
你不应该使用晶圆厂,而不是abs吗? abs占用整数并仅返回整数
答案 2 :(得分:1)
“对于角度1.51423,它表明sin = 29”
这很可能是观察错误,而不是sin函数的错误。
结果应在-1到+1范围内。
干杯&amp;第h。,