计算正弦或余弦时的奇怪符号问题

时间:2012-08-06 02:00:05

标签: c++ floating-point decimal precision sign

我正在尝试编写一个小程序来计算用户以度为单位提供的角度的正弦和余弦,精度为6位小数。

它是这样的:

输入(角度)

90

输出(正弦余弦)

1.000000 0.000000

但是我有一些问题,例如,当用户输入 -850 时,程序会返回:

-1.000000 -0.000000

注意 -0.000000 ,是否有一种干净的方法可以避免这种情况?它一定很简单,但我很想念它。

顺便说一下,用一种干净的方式,我的意思是清洁,而不是像

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;
}

感谢您的关注。

2 个答案:

答案 0 :(得分:2)

在这种情况下,最好的答案是将数字打印到字符串,然后检查字符串。如果字符串是文字常量-0.000000,则将其替换为0.000000。

这可能看起来像是一个黑客,但它实际上是最稳定的解决方案。您可以尝试通过将其与-0.000001进行比较来按照解决方案中的建议钳制输入值,但这并不一定会告诉您是否已打印-0.000000。如果打印代码舍入到最近,则-0.0000009将打印为-0.000001,但检查将使其打印为零,这可能是一个错误。

只需进行字符串检查并继续。这是唯一保证完全正确的解决方案。或者,如果您不介意可能略微过少0.000000的结果,请使用-0.000001的比较。

或者,只留下代码。 -0.000000实际上提供了额外的信息 - 这不是一件坏事。

答案 1 :(得分:0)

What every programmer should know about floating point

你可以这样做:

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

我还没有找到一种方法来告诉iostream不要在负零上打印减号。