0

我正在尝试编写一个小程序来计算用户以度为单位提供的角度的正弦和余弦,精度为小数点后 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;
}

感谢您的关注。

4

2 回答 2

2

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

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

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

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

于 2015-06-18T14:49:37.060 回答
0

每个程序员都应该知道的浮点知识

你可以这样做:

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

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

于 2012-08-06T02:40:44.463 回答