2016-10-11 2 views
2

Warum geht mein Code für den x-Wert nur dann auf den Wert 2,4, wenn ich als Schrittweite 0,1 eingegeben habe? Wenn ich einen Wert wie .01 oder .001 gebe, geht es bis zu 2,5.C++ Euler Approximation

#include <iostream> 
#include <iomanip> 
using namespace std; 
int main() { 
    double step; 
    double x0 = 1.0; 
    double y0 = 1.0; 
    double diffY; 
    std::cout << std::fixed; 
    std::cout << std::setprecision(2); 
    cout << "Enter step value: "; 
    cin >> step; 
    while (x0 <= 2.5) { 

     diffY = x0 + ((3*y0)/x0); 
     cout << x0 << " " << y0 << "\n"; 
     x0+=step; 
     y0+=step*(diffY); 
    } 

    return 0; //initially defined the main function to return an int 
} 

Vielen Dank!

+0

Sie sollten Schleife mit Integer-basierten Grenzen, und innerhalb der Schleife skalieren Sie die Werte nach unten. Andernfalls kann Ihre Schleife je nach Compiler, Compiler-Optionen usw. unterschiedlich oft ausgeführt werden. – PaulMcKenzie

Antwort

0

gute alte Art und Weise Gleitkommazahl Fehler, aus einer hohen Präzision drucken Sie Ihre x0, werden Sie diese:

1.1000000000000001 
1.2000000000000002 
... 
2.4000000000000012 
2.5000000000000013 

Hinweis, wie auf dem letzten Vergangenheit, werden Sie Vergangenheit daher 2,5 erhöht nicht Führe deine letzte Schleife aus. Dies liegt daran, dass Gleitkommazahlen binär (Basis 2) und nicht dezimal (Basis 10) sind, so dass sie nicht jede Zahl genau darstellen können. Dazu gehört 0.1.

Sie sollten immer ein Epsilon verwenden, wenn Gleitkommazahlen Vergleich:

float eps = step/100; // Only an example. 
while (x0 <= 2.5 + eps) { 
    ... 

Für mehr Informationen, read this. Wenn Sie spielen möchten, here is a live example.

+0

* "Dies liegt daran, dass Fließkommazahlen binär (Basis 2) und nicht dezimal (Basis 10) sind und daher nicht jede Zahl genau darstellen können." * Das gilt für jede Ganzzahlbasis (endlich viele Ziffern). –

+0

Ich schlage vor, nicht mit Floating-Point-Loop-Indikatoren zu loopen. Holen Sie diese Loop-Constraint-Werte auf jeden Fall ganzzahlig. – PaulMcKenzie