2016-09-29 7 views
1

Ich habe mit dem babylonischen Quadratwurzel-Algorithmus aus einer Zuweisung in meinem Intro zu Programmierklasse gespielt. Das Programm funktioniert gut und gibt ziemlich genaue Antworten. Meine Frage ergibt sich aus etwas seltsames passiert in der Zeile (während rate! = Ergebnis) Ich schrieb, dass während der Anweisung, um die beiden Begriffe zu überprüfen, und sobald sie identisch sind, brechen Sie die Schleife. Wenn Sie jedoch beispielsweise 50 als Startnummer eingeben, überprüft die Schleife zwei identische Zahlen dreimal, bevor sie ausbricht, statt einmal. Liegt das daran, dass mehr Zahlen im Hintergrund geknackt werden, dass der doppelte Datentyp nicht angezeigt werden kann? Ich weiß Double kann bis zu 15 Dezimalstellen gehen. Ich hoffe, ich formuliere das auf eine verständliche Art und Weise, wenn jemand Klärung braucht, frag einfach. PS- Wenn jemand Tipps hat, um meinen Code sauberer zu machen, lassen Sie es mich bitte wissen, ich versuche zu lernen, wie ich meinen Code so lesbar wie möglich formatiere.C++ - Datentypen und wie sie dargestellt werden

#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

Das erste Problem zu „schweben“ ist, dass Sie 'result' verwenden, bevor es initialisiert wird. Das ist * undefiniertes Verhalten *. Das andere Problem ist das, das im Kommentar von @NathanOliver verlinkt ist. –

+0

@ Jaochim Pileborg Ich glaube, ich habe das Ergebnis initialisiert, wo meine Doppelvariablen sind, oder? – Taharix

+0

Auch danke für den Link, ich wusste nicht, wie man dies für ein mögliches Duplikat zu suchen – Taharix

Antwort

2

"Erraten" und "Ergebnis" sind "Double" -Typ, es hat eine höhere Präzision als Sie mit Standard-Cout Fließkommazahl Display-Länge sehen können.

Sie denken, dass die Zahlen gleich sind, aber sie sind nicht. weiter weg von Dezimalpunkt können Sie den Unterschied sehen.

Lösung 1: Ändern Sie den Cout Dezimalzahl Anzeigebereich auf einen längeren Wert, so dass Sie sehen können, dass die Zahlen tatsächlich unterschiedlich sind, so while-Schleife nicht unterbrochen. Verwenden Sie cout.precision(17); am Anfang des Codes.

Lösung 2: Datentyp des Ergebnisses Vermutung & ändern

+1

Vielen Dank, Sie haben den Grund und mögliche Lösungen sehr klar gemacht – Taharix

+0

Ändern der Doppelgänger zu schwimmt tatsächlich ein anderes Problem behoben, bei dem das Quadrat von Null mehr als 1000 Schritte benötigte, jetzt dauert es nur noch 150 Ish, wegen besserer Rundung, nehme ich an. Vielen Dank! – Taharix

+0

@Taharix Es ist nicht wirklich "bessere Rundung", weil "float" weniger Präzision als "double" hat, so dass es viel weniger Iterationen braucht, bevor das Ergebnis nicht von Null zu unterscheiden ist. – TripeHound

Verwandte Themen