2017-04-09 1 views
0

Also, ich schreibe eine sehr einfache Funktion, um den Wert von pi mit Reimanns Summe auf einem Viertel eines Einheitskreises anzunähern. Dies ist mein Code:Meine Funktion gibt nichts zurück; Terminal betritt ein Fegefeuer?

double pi_approx(unsigned int n) 
{ 
    double width = 1/n; 
    double sum = 0; 
    for(int i = 0 ; i <= 1 ; i += width) 
    { 
     sum += width * (1 - i * i); 
    } 
    return 4 * sum; 
} 

Aber wenn ich es auf meinem Terminal laufen, es geht nur diesen Zustand, wo ich irgendwie nur, was eingeben können? Was ist dieser Zustand und warum betrete ich ihn? Wie kann ich das vermeiden?

+0

ich nicht folgen. Dies ist der einzige Code in der Datei, die Sie kompiliert haben? Es gibt keinen Einstiegspunkt? Schreibe einen [mcve]. – StoryTeller

+2

'i + = width' ergibt immer nur' i', da es sich um Integer-Arithmetik handelt. – kaylum

+0

Der einzige Eintrag (der sich in einer anderen Datei befindet) ist dieser: int main (intargc, char * argv []) { pi_approx (25); } als Test –

Antwort

4

Zwei Probleme, beide ein Ergebnis der Ganzzahlarithmetik.

  1. Wie kaylum wies in den Kommentaren aus. i+=width ändert nicht i, wenn i eine ganze Zahl ist und width < 1.

  2. 1/n ist Null, also width ist Null und Ihre Loop-Variable wird nie aktualisiert.

So, mit diesen Fragen im Kopf:

double pi_approx(unsigned int n) 
{ 
    double width = 1.0/n; // One double operand, so n is promoted. 
    double sum = 0; 
    for(double i = 0 ; i <= 1 ; i += width) 
    { 
     sum += width * (1 - i * i); 
    } 
    return 4 * sum; 
} 
+0

verwendet. Alle diese Literale sollten auch 'double' anstatt' int' sein. IE: 'double sum = 0.0;' und 'für (double i = 0.0; i <= 1.0; i + = width)' und 'sum + = width * (1.0 = i * 1);' und schließlich 'return 4.0 * sum; 'Abhängig von der impliziten Konvertierung ist dies eine hervorragende Möglichkeit, einige böse Überraschungen zu bekommen – user3629249