2016-09-29 3 views
1

私は、プログラミングクラスのイントロでの割り当てからバビロニア平方根アルゴリズムを使用して遊んでいます。 プログラムはうまく動作し、かなり正確な答えを出します。私の質問は何か不思議なことから起きている(推測しながら!=結果) 私はwhile文を使って2つの言葉をチェックし、それらが同じになるとすぐにループを壊します。しかし、スタート・ナンバーとして50を入力すると、1回ではなく2回同じ番号がループの前に3回チェックされます。これは、倍数のデータ型が表示されないため、バックグラウンドでより多くの数値がクランチされているためですか?私は倍数が小数点以下15桁まで上がることができることを知っています。誰かが明確化を必要とするならば、私は理解できる方法でこれを言いたいと思う。 PS-誰かが私のコードクリーナーを手助けするためのヒントを持っているなら、私に教えてください、私はコードをできるだけ読みやすいように書式設定する方法を学ぼうとしています。C++のデータ型とその表現方法

#include <iostream> 

using namespace std; 

int main() 
{ 
    double input,  // Users number 
      guess = 2, // First guess, always 2 at beginning 
      result,  // altered guess, becomes guess 1 when repeated 
      r;   // input divided by guess 

    int steps = 1,  // keeps track of step number, for debugging 
     loop = 1;  // controls continue loop 

    string error_1 = " Warning: input is negative, please pick a new one"; 

    while (loop == 1) 
    { 
     cout << "--Babylonian Square Root Algorithm--" << endl; 
     cout << "Type a positive number to find its square root: "; 
     cin >> input; 

     if (input >= 0) 
     { 
      while (guess != result) // test here for within 1% 
      { 
       r = input/guess; 
       result = (guess + r)/2; 
       // DEBUG 
       cout << "-------" << endl; 
       cout << " Step # " << steps << endl; 
       cout << "-------" << endl; 
       cout << " R) " << r << endl; 
       cout << " Guess) " << guess << endl; 
       cout << " Result) " << result << endl; 
       steps++; 

       guess = result; 
       result = (guess + r)/2; 
       cout << result << " is the approximate square root of " << input << endl; 
       //DEBUG 
       cout << " Steps required: " << steps - 1 << endl; 
      } 
      else 
      { 
       cout << error_1 << endl; 
      } 
      cout << "Continue? (Yes = 1, No = 0)" << endl; 
      guess = 2; 
      result = 0; 
      steps = 1; 
      cin >> loop; 
      cout << "------------------------------------------------------" << endl; 
     } 
     return 0; 
    } 
} 
+1

最初の問題は、それが初期化される前に、あなたは 'result'を使用することであると推測&結果のデータ型を変更します。それは*未定義の動作*です。もう一つの問題は、@ NathanOliverのコメントにリンクされている問題です。 –

+0

@ Jaochim Pileborg私は二重変数がどこにあるのか結果を初期化したと思いますか? – Taharix

+0

また、リンクのおかげで、私は可能性の重複のためにこれを見分ける方法を知らなかった – Taharix

答えて

2

「推測」と「結果」は「倍精度」型で、デフォルトのcout浮動小数点桁の表示長よりも高い精度を持ちます。

数字は同じだと思いますが、そうではありません。小数点から遠くに行くと、その違いを見ることができます。

解決策1:coutの10進数の表示範囲をより長い値に変更して、実際に数値が異なることがわかるようにして、whileループが中断しないようにします。 コードの先頭にcout.precision(17);を使用します。

解決方法2:「フロート」

+1

ありがとう、あなたは理由と可能な解決策を非常に明確にしました – Taharix

+0

doubleをfloatに変更しました実際にはゼロのsqrtが完了するために1000ステップを引き継いでいた別の問題を修正しました。ありがとう! – Taharix

+0

@Taharixこれは、「浮動小数点型」が「double」よりも精度が低いため、結果がゼロから区別できないようになるまでにははるかに少ない反復回数がかかるため、実際には「より良い丸め」ではありません。 – TripeHound

関連する問題