2012-08-06 103 views
0

我正在嘗試編寫一個小程序,用於計算用戶提供的角度的正弦和餘弦,精度爲6位小數。計算正弦或餘弦時奇怪的符號問題

它是這樣的:

輸入(角度)

90 

輸出(正弦餘弦)

1.000000 0.000000 

但我有一個問題與他們中的一些,例如,當用戶輸入-850,程序返回:

-1.000000 -0.000000 

注意-0.000000,有沒有一種乾淨的方法來避免這種情況?它一定很簡單,但我很想念它。

BTW,以清潔的方式,我指的東西清潔像

if(angle > -0.000001) 
{ 
     angle = 0.000000; 
} 

下面的代碼:

#include <iostream> 
#include <cmath> 
#include <iomanip> 

using namespace std; 

int main() 
{ 
     float angle; 

     while(1) 
     { 
       cin >> angle; 
       if(cin.eof()) 
       { 
         return 0; 
       } 
       angle = angle*M_PI/180.0; 
       cout << fixed << setprecision(6) << sin(angle) << " " << cos(angle) << endl; 
     } 
     return 0; 
} 

感謝您的關注。

+0

你還在積極尋找答案嗎? – chux 2013-08-06 05:24:07

回答

2

這種情況下的最佳答案是將數字打印到字符串,然後檢查字符串。如果字符串是文字常量-0.000000,則將其替換爲0.000000。

這可能看起來像一個黑客,但它實際上是最穩定的解決方案。您可以嘗試通過將解決方案中的輸入值與-0.000001進行比較來鎖定輸入值,但這並不一定告訴您是否已打印-0.000000。如果打印代碼舍入到最近,那麼-0.0000009將打印爲-0.000001,但該檢查會導致它打印爲零,這可以說是一個錯誤。

只要做字符串檢查並繼續前進。這是保證完全正確的唯一解決方案。或者,如果您不介意0.000000結果可能略少,請使用與-0.000001的比較。

或者,只保留代碼。 -0.000000實際上提供了額外的信息 - 這不是一件壞事。

0

What every programmer should know about floating point

你可以這樣做:

if (angle == -0.0) { angle = 0.0 } 

我一直沒要找到一種方式來告訴iostream的不打印負零減號。

+0

我知道四捨五入錯誤,我沒有要求解釋,我正在尋求解決方案。也許我應該澄清一點... – 2012-08-06 22:14:15

+0

這不僅僅是四捨五入錯誤,IEEE浮點真的有一個負零。請參閱http://stackoverflow.com/questions/73686/cout-prints-0-instead-of-0。 – Barmar 2012-08-07 02:30:38

+0

這個答案其實並不正確。實際結果很可能是-0.000000000047。當它被格式化爲具有六位精度的顯示時,它被打印爲-0.000000。您的支票不會改變這一點。 – 2015-06-18 14:44:22