-1

私は C++ クラスの宿題をやっていますが、C++ は初めてです。if ステートメントでいくつかの問題に遭遇しました... 私がやっていることは、ユーザーに 0.00 から 23.59 までの時間を入力させることです。: はピリオドに置き換えられます。その部分は機能します。次に、時と分を分けて、それらが有効な拘束状態にあることを確認します。時間のチェックは機能しますが、分は機能しません...私のコードは次のとおりです。

minute= startTime - static_cast<int>(startTime);
hour= static_cast<int>(startTime);

//check validity
if (minute > 0.59) {
    cout << "ERROR! ENTERED INVALID TIME! SHUTTING DOWN..." << endl;;
    return(0);
}
if (hour > 23) {
    cout << "ERROR! ENTERED INVALID TIME! SHUTTING DOWN..." << endl;;
    return(0);
}

繰り返しますが、23 を入力すると時間は機能しますが、23.59 を入力するとエラーが発生しますが、23.01 を入力するとエラーが発生しません。また、0.59 を入力するとエラーが発生しますが、0.58 は発生しません。に切り替えてみif(minute > 0.59)ましたif(minute > 0.6)が、何らかの理由で他の場所で問題が発生しました。私は何をすべきかについて完全に途方に暮れているので、どんな助けも素晴らしいでしょう! どうもありがとう!

編集: 0.58を入力したところ、エラーは表示されませんでした...しかし、1.59にすると、再びエラーが表示されます...また、賛成票がいいでしょう:D

4

4 に答える 4

1

浮動小数点演算 (floatおよびdouble) は本質的にあいまいです。ストリームに送信される丸められた表現では表示されない小数点の後ろには常にいくつかの桁があります。また、使い慣れた (10 進数の) 表現はコンピューターが使用するものではないため、比較もあいまいになる可能性があります (バイナリ)。

int hours時間をとで表すint minutesと、問題は消えてなくなります。ほとんどのライブラリは時間をティック (通常は秒またはマイクロ秒) で測定し、サブティックの解像度を提供しません。それらをエミュレートするのは良いことです。

于 2013-02-20T15:36:38.263 に答える
1

浮動小数点数の比較は、底 2 で正確に表現できるものはほとんどないため、失敗する傾向があります。2 つの異なる数値が異なる方向に丸められる可能性は常にあります。

最も簡単な修正は、比較している数値に非常に小さなファッジ ファクターを追加することです。

if (minute > 0.59 + epsilon)

すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを参照してください。

于 2013-02-20T15:37:17.823 に答える