Probleme mit Rundung



  • Hallo,
    ich habe ein kleines Problem mit einem Programm, ich wollte folgendes machen. Ich habe 21 Wert aus einem Graphen ausgelesen und diese in einen Array gepackt. Diese sollen dem Wert phi von 0.8 bis 1.0 in 0.01 Schritten also 0.81, 0.82... zugeordnet werden. Rein kommen die Phi Werte als float im Bereich von 0.8 bis 1.0 ...
    Folgendes habe ich mir überlegt. Erst die Werte auf zwei Nachkommastellen runden siehe funktion Round(). Dann dem Wert 0.8 abziehen und das ganze *100 nehmen.
    z.B (0.84 - 0.8) * 100 = 4
    dann diesen immer noch float wert einem int wert zuordnen..
    Dann diesen wert aus dem Array auslesen.. und ausgeben...

    Soweit so gut.. das funktioniert auch teilweise richtig.. jetzt habe ich aber z.B 0.9456 eingegeben und es kommt gerundet 0.95 raus.. auch noch richtig.
    Der float Wert ist 15 auch richtig.
    ABER der int Wert ist auf einmal 14!! Warum
    das??

    Die ganzen Ausgaben im Hauptprogramm sind nur zum suchen des Fehlers...
    den ich aber nicht finden konnte.
    Kann einer Helfen?
    Danke im Vorraus

    #include <cstdlib>
    #include <iostream>
    #include <cmath>
    
    using namespace std;
    float i;
    float Smith[21] = {1.02, 1.7, 1.65, 1.6, 0.99,
     1.1, 1.85, 1.8, 0.99, 1.05, 1.15, 1.3, 1.85,
     1.03, 1.1, 1.2, 2.08, 1.03, 1.1, 1.23, 1.38};
    float phi;
    float phi_rund;
    float psi;
    float Round(float phi);
    
    int main(int argc, char *argv[])
    {
        cout <<"Phi eingeben: \n";
        cin >>phi;
        phi_rund = Round(phi);
        cout << phi_rund <<endl;
        i = (phi_rund - 0.8) * 100;
        cout <<"i = " <<i <<endl;
        //int j = (int)i;
        int j = static_cast<int>(i);                //Umwandlung i von float zu int und übergabe an j
        cout <<"j = " <<j <<endl;
        psi = Smith[j];
        cout <<psi <<endl;
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
    float Round(float phi)                  //Funktion zur Rundung auf zwei Nachkommastellen
    {
        phi *= 100;
        phi = floor(phi + 0.5);
        if (phi >= 0)                       //Rundung von positiven Zahlen
        {
            phi = floor(phi + 0.5);
        }
        else                                //Rundung von negativen Zahlen
        {
            phi = ceil(phi - 0.5);
        }
        phi /= 100;
        phi_rund = phi;
        return phi_rund;
    }
    


  • benutz einfach die zweite hier im post verwendete methode:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39342.html



  • Ich habe doch nichts anderes gemacht als die Methode ein wenig umzuschreiben, die Rundung funktioniert ja auch Einwandfrei.. bei der umwandlung von float nach int liegt das Problem glaube ich...



  • wenn du als entwicklungsumgebung VS benutz solltest du für sowas den debugger verwenden.

    als Antwort, wieso 14 und nicht 15 rauskommt:

    phi_rund = Round(phi); //-> phi_rund = 14.999999

    -> (int)phi_rund /=(int)14.999999=/=14;

    bei cout<<phi_rund<<endl;

    kann wird auf die eingestellte genauigkeit gerundet -> 14.999999 -> 15



  • muffmolch schrieb:

    phi_rund = Round(phi); //-> phi_rund = 14.999999

    -> (int)phi_rund /=(int)14.999999=/=14;

    Zu sehen damit:

    #include <iomanip>
    ...
    cout.precision(8);
    


  • Ok das macht Sinn, bedeute obwohl er als Wert 15 für float anzeigt ist es im Endeffekt eigentlich 14.999999
    Danke für die Hilfe.. muss ich mir wohl was anderes überlegen!


Anmelden zum Antworten