web-dev-qa-db-ja.com

浮動小数点例外C ++なぜ、何ですか?

私はオイラープロジェクトの質問3のプログラムを作成していますが、結果としてそれは実際には重要ではないかもしれませんが、私は現在このコードに数を取り、それが素数かどうかをテストしようとしています。次に、関数のトラブルシューティングを行う前に、数値を入力した直後に「浮動小数点例外」というエラーが表示されます。コードは次のとおりです。

int main()
{
    int input;
    cout << "Enter number: " << endl;
    cin>> input;
    int i = input/2;
    int c;
    for (i>0; i--;) {
        c= input%i;
        if (c==0 || i == 1)
            cout << "not prime" << endl;
        else
            cout << "prime" << endl;
    }
    return 0;
}

本質的になぜ浮動小数点例外が発生するのですか?それはどういう意味ですか?

32
samuraiseoul

浮動小数点数 」は、コンピューターが通常整数ではない数、基本的には小数点付きの数を表す方法です。 C++では、floatの代わりにintで宣言します。浮動小数点例外は、ゼロ除算など、浮動小数点数では不可能なことを行おうとしたときに発生するエラーです。

34
Crashworks
for (i>0; i--;)

おそらく間違っているはずです

for (; i>0; i--)

代わりに。セミコロンを配置する場所に注意してください。条件は中間で、開始時ではありません。

33
fredoverflow

浮動小数点例外の多くの理由。コードを見ると、forループは少し「間違っている」ようです。ゼロ除算のように見えます。

for (i>0; i--;){
c= input%i;

Iをデクリメントしているため、ある時点でゼロで除算されます。

10
Pete

このページはGoogle検索「c ++浮動小数点例外」の結果1位なので、このような問題を引き起こす可能性のある別の事柄、未定義変数の使用を追加します。

2
Algoman

問題はコードスニペットのforループにあります。
for(i> 0; i--;)

ここで、あなたの意図は(i> 0)ifループに入るで、iの値を1つ減らすforループの完了後のようです。

それはそのように機能しますか?どれどれ。

For()ループ構文を見てください:

**for ( initialization; condition check; increment/decrement ) {  
    statements;  
}**

初期化は、ループの開始時に一度だけ実行されます。 「;」に細心の注意を払ってくださいコードスニペットで、forループ構文でマップします。

初期化:i> 0:1回だけ実行されます。コードに影響はありません。

条件チェック:i-:デクリメント後。

              Here, i is used for condition check and then it is decremented. 
              Decremented value will be used in statements within for loop. 
              This condition check is working as increment/decrement too in your code. 

ここで停止して、浮動小数点例外を見てみましょう。

それは何ですか?簡単な例の1つは0で除算することです。コードでも同じことが起こります。

条件チェックで1に達すると、条件チェックがtrueであることが検証されます。
post decrementのため、iがforループに入ると0になります。

Modulo operation at line #9 results in divide by zero operation.  

この背景により、forループの問題を修正できるはずです。

0
Manjunatha S M