2012-08-06 75 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