type cast bei division



  • Hallo,

    Wenn ich folgendes Programm ausführe, erhalte die angefügte Ausgabe.

    Programm:

    #include <iostream>
    using namespace std;
    
    int main()
    {
       float a = 1;
       float b = 0.001;
    
       int ires = a / b;
       float fres = a / b;
    
       cout << "ires: " << ires << endl
             << "fres: " << fres << endl;
    
       return 0;
    }
    

    Ausgabe:

    ires: 999
    fres: 1000
    

    Mich würde interessieren, ob dieses Verhalten Standard ist oder ein Fehler meines Compilers (gcc 4.3.2 unter Linux).

    Wie kann ich, sollte dieses Verhalten so vorgesehen sein, erreichen, dass auch die integer-Variable das richtige Ergebnis enthält?

    Calvin-gr



  • sie erhalten beide das richtige Ergebnis. Float hat Ungenauigkeiten (Rundungsfehler), daher ist a/b irgendsowas wie 999.99997f. Wenn du den float ausgibst mit 4 Stellen Genauigkeit wird aufgerundet -> 1000.000. Wenn du den float an ein int übergibst wird gecastet und zwar so, dass einfach die Nachkommastellen abgeschnitten werden -> 999.


  • Mod

    Und falls du ein gerundetes Ergebnis wünscht, so kannst du das beispielsweise durch

    int ires = a / b + 0.5;  // Kaufmännische Rundung, mathematische Rundung ist ein bisschen komplizierter
    

    erreichen.



  • ok, danke für die antworten.


Anmelden zum Antworten