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 に答える