2010-11-21 15 views
23

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

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

本質的になぜ私に浮動小数点例外が与えられているのですか。それはどういう意味ですか?

+6

forループで何か問題があります。 – Lazer

+0

浮動小数点例外には多くの理由がありますが、コードに応じて、私はPeteと同意し、私はc = input%iだと思います。問題の原因であり、私の答えがあなたを助けてくれることを願っています。 – TopDeveloper

答えて

24

"floating point number"は、コンピュータが通常整数ではない数値を表す方法です。基本的に小数点以下の数字です。 C++では、intの代わりにfloatと宣言します。浮動小数点例外は、ゼロで割るなど、浮動小数点数では不可能な何かをしようとすると発生するエラーです。

+0

さて、それを修正しようとする前に自分のコードを理解していることを確認しましょう。 for lopはi> 0の場合にのみ実行されます。その後、それが後で分けられる唯一の時間はc = input%iなので、それは決して0で割るべきではありませんか? – samuraiseoul

+0

ループを慎重に見ると、i == 0で本体が1回実行できる方法があることがわかります。 – Crashworks

+0

i == 1の場合は?だから、forループのインクリメント/デクリメントは、ループの終わりに、それを上に書いても起こりますか? – samuraiseoul

9

浮動小数点例外の理由はたくさんあります。あなたのコードを見れば、あなたのforループは少し "間違っている"ようです。可能性のあるゼロ除算のように見えます。

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

私はデクリメントしているので、ある時点で0で除算します。

+0

forループは自動的に最初にiを減らしますか? – samuraiseoul

+0

私は、ブレークポイントをいくつか使用し、解決策をもう少し考えてみる必要があると思います。あなたは私たちにあなたに答えを与えるだけでいいのですか? – Pete

28
for (i>0; i--;) 

おそらく間違っているし、代わりに

for (; i>0; i--) 

でなければなりません。私がセミコロンをどこに置いたかに注意してください。条件はの中ので、開始時ではありません。

+0

はい、それは浮動小数点例外の理由ではありません。 – Anonymous

+1

@Anonymous間接的です。セミコロンの誤った配置により、 'i'は' 0'(これは 'i> 0'は賞賛されませんでした)でした。 – Ontonator

0

問題は、コードスニペットのループのためにあります(; i--; I> 0)
ためここで

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

そのように機能しますか?どれどれ。以下のための()ループ構文で

ルック:

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

初期化はループの最初に一度だけ実行されます。 ";"あなたのコードスニペットでそれをforループ構文でマップします。

初期化:i> 0:一度だけ実行されます。あなたのコードには何の影響もありません。

条件チェック: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になると、条件チェックで真となります。
ポストデクリメントのため、forループに入るとiは0になります。

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

このバックグラウンドでは、forループの問題を修正できるはずです。

関連する問題