2010-03-25 31 views
1

有沒有人在處理sin/cos/tan/acos時看到這個奇怪的值..數學的東西?如何處理計算acos/sin/atan2的奇怪錯誤?

===怪異VALUE ===

-1。#IND00

=====================

void inverse_pos(double x, double y, double& theta_one, double& theta_two) 
{ 
    // Assume that L1 = 350 and L2 = 250 


    double B = sqrt(x*x + y*y); 
    double angle_beta = atan2(y, x); 
    double angle_alpha = acos((L2*L2 - B*B - L1*L1)/(-2*B*L1)); 
    theta_one = angle_beta + angle_alpha; 
    theta_two = atan2((y-L1*sin(theta_one)), (x-L1*cos(theta_one))); 
} 

這是我正在處理的代碼。

在一個具體的條件 - 像當x & y是10 & 10, 這個代碼存儲-1#IND00成theta_one & theta_two

它看起來並不像任何字符或數字:(

毫無疑問,ATAN2/ACOS /東西都是問題。

但問題是,try和catch不起作用無論是 的Cuz的double變量已成功存儲 一些其中的值

此外,以下計算從不抱怨 永不打破PROGR am

我想迫使以某種方式使用該值,使整個程序崩潰...... 所以,我可以趕上這個錯誤的..

除了這個想法,我不知道怎麼我應該檢查這些 theta_one和theta_two變量是否存儲了這個瘋狂的值。

任何好主意?

預先感謝您..

+0

咦? C中不允許嗎? - (我是C++的人) – Phrixus 2010-03-25 08:18:48

+0

'try'和'catch'也是C++,而不是C. – dreamlax 2010-03-25 08:19:42

+0

你的輸入是什麼?你如何印刷「怪異」的價值?看起來這可能是負無窮的表示。 – msw 2010-03-25 08:19:58

回答

10

的 「怪異值」 是NaN(非數字)。

問題是因爲(L2*L2 - B*B - L1*L1)/(-2*B*L1) = 6.08112…不在[-1,1]範圍內,其中acos在實數上是明確定義的。所以NaN被退回。

你確定公式是正確的嗎?


如果你想捕獲一個NaN,NaN需要是一個信號NaN。對於gcc,使用-fsignaling-nans選項進行編譯。

+1

好的答案,我已經看到過這種情況,您可能會認爲輸入值介於-1和1之間,但實際上是最大的一位(由於舍入錯誤)。您需要首先計算數字*然後*在將其傳遞給acos之前將其強制到範圍內。 EG:double xx =(L2 * L2 ...);如果(xx> = 1)xx = 0.9999999999;或類似的東西。 – paxdiablo 2010-03-25 08:35:29

+0

YOU GUYS ROCK !!! NaN造成了所有的麻煩! 我曾經在英文中看到NaN錯誤信息,並處理它。 但不是這樣。感謝你們所有的時間! – Phrixus 2010-03-25 08:47:13