Anzeige:
Ergebnis 1 bis 7 von 7

Thema: C++ Double-Division

  1. #1
    Registrierter Benutzer
    Registriert seit
    27.02.2009
    Beiträge
    8

    C++ Double-Division

    hallo,
    habe ein problem, das mich langsam zur verzweiflung treibt: also, ich führe folgendes programm aus:

    Code:
    #include <iostream>
    
    int f(double a, double b) {
    	
    	int x = a/b;
    	std::cout << a << " " << b << std::endl;
    	return x;
    }
    
    int main(int argc, char** argv)
    {
    	double a(1.0), b(0.01);
    	int x = f(a,b);
    	std::cout << x << std::endl;
    	return 0;
    }
    eigentlich müsste jetzt x = 100 sein, ist es auch, wenn ich das "cout a b" in der funktion f auskommentiere. wenn ich den code aber wie oben, mit dem cout in f ausführe, ist x = 99

    ich kann mir das einfach nicht erklären.. woran liegt das? danke für eure hilfe!
    (kompiliert unter ubuntu mit g++)

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Vielleicht kommt ein Kompileroptimierungsschritt nicht zum Zuge, etc.

    Probier mal das Ergebnis zunächst einer double Variabe zuzuweisen und erst dann zu casten/runden.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    27.02.2009
    Beiträge
    8
    vielen dank, du hattest recht, es lag an beidem, was du geschrieben hast. ich habe vorher mit -O3 kompiliert, wenn ich das weglasse und außerdem
    Code:
    double y = a/b;
    int x = y;
    schreibe, dann gehts.

    Allerdings geht
    Code:
    double x = a/b
    ohne den zwischenschritt auch ohne -O3 nicht.

    verstehe leider überhaupt nicht, warum sich das so verhält. kannst du dir da einen reim drauf machen?

  4. #4
    Registrierter Benutzer
    Registriert seit
    27.02.2009
    Beiträge
    8
    mittlerweile wirds mir echt unheimlich. habe jetzt die cpp-Datei auf einem anderen Rechner kompiliert (mit g++ (GCC) 4.2.1 (SUSE Linux)) und die ergebnisse sind richtig, mit und ohne Optimierungsoption O3.

    (eigentlich gehts um eine größere quelldatei, in der das oben beschriebene problem an verschiedenen stellen auftritt (in konstruktoren usw.)

    kompiliere ich die allergleiche Datei auf meinem laptop (mit g++ (Ubuntu 4.3.2-1ubuntu12) 4.3.2) wird an verschiedenen stellen falsch dividiert.

    das gibts doch gar nicht, woran kann das liegen?

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Könnte ein Fehler im Compiler sein.

    Falls deine Divisionen nicht immer ganzzahlige Ergebnisse liefern, du also als Resultat runden willst, ist es vermutlich besser es so zu machen

    Code:
    double y = a/b;
    if (y < 0.0) y -= 0.5;
    else y += 0.5;
    int x = y;
    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #6
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    In deinem Beispiel Rechnest du 1/0, (Mein Compiler sagt Gleitkomma-Ausnahme) macht also wenig sinn.
    Oder verwende die math funktionen um den Restwert von double werten zu erhalten.
    Code:
    // g++ -O4 -Wall -W -Wextra -pedantic d.cpp -o test
    
    #include <iostream>
    #include <cmath>
    
    int f(double a, double b)
    {
      std::cout << a << " " << b << std::endl;
      return  fmod(a,b);
    }
    
    int main(int, char**)
    {
        double a(1.0), b(0.01);
        int x = f(a,b);
        std::cout << x << std::endl;
        return 0;
    }
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  7. #7
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von undefined Beitrag anzeigen
    In deinem Beispiel Rechnest du 1/0, (Mein Compiler sagt Gleitkomma-Ausnahme) macht also wenig sinn.
    Nein, gerechnet wird ja noch mit den (nicht auf Ganzzahlen gerundeten) doubles. Erst das Ergebnis wird bei der Zuweisung nach int konvertiert...

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •