【问题标题】:C++ sin() returns incorrect resultsC++ sin() 返回不正确的结果
【发布时间】:2011-02-05 10:28:16
【问题描述】:

我有这段代码

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 有什么想法吗?

【问题讨论】:

  • 当 sin 产生 >1 时,那么您的设置中真的出了问题。也许有人编写了自己的 sin 函数来隐藏原始函数?您可以在对象和库文件上使用nm 来搜索有问题的文件。

标签: c++ trigonometry


【解决方案1】:

函数abs(定义在cstdlib)总是接受一个整数并返回一个整数。在处理doubles 时,您应该改用fabs

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

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

【讨论】:

    【解决方案2】:

    你不应该使用 fabs 而不是 abs 吗? abs 接受整数并只返回整数

    【讨论】:

    • @Dragonkin in 它被重新定义并且仅适用于整数。
    • 好吧,看起来你发现了问题:-) 没有“abs”的代码中的 sin(angle) 返回正确的值(尽管在 gdb 中“p sin(angle)”仍然返回奇怪的整数),现在编译最终的更正:-)
    【解决方案3】:

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

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

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

    干杯,

    【讨论】: