2011-02-05 159 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的範圍內。

乾杯&心連心,