[C++] Dividieren von Ganzzahlen

Online-Skater

Erfahrenes Mitglied
Hi Leute,

ich habe wahrscheinlich ein unfassbar einfaches Problem aber ich habe mich damit noch nicht so richtig beschäftigt und finde komischerweise auch bei der renommierten Suchmaschine nichts vernünftiges.

Problem: Für den Gauß-Algorythmus habe ich folgende Zeile:
C++:
double z = -(_arr[j][i]/_arr[i][i]);

Manchmal kommen dort für mich unerwartende Werte raus z.b. -8/-6 = 4/3 = 1,33333~Periode der Rechner meint nun das ergibt -1.#INF
Ja gut das er die rationale Zahl nicht korrekt darstellen kann ist mir aufgrund der Rechnerarchitektur schon klar aber ich habe erwartet das er irgendwann abschneidet.

Wie kann ich das Problem lösen ?

Danke für eure Anregungen :)
 
Hallo,

welchen Datentyp besitzen die Elemente von _arr? Wenn das Integer sind, dann wird zunächst eine Ganzzahldivision durchgeführt, wodurch die Nachkommastellen abgeschnitten werden. Erst dann folgt die Konvertierung in double. Du müsstest also mindestens eine der Ganzzahlen auf double casten, damit eine Fließkommadivision durchgeführt wird.

Grüße,
Matthias
 
Hey entschuldige der Titel ist denke ich nicht richtig gewählt. Der Typ ist ebenfalls double ich wollte nur mal ein einfaches Beispiel posten.
Nebenbei der Rechner macht (so gut) wie nie Fehler, es war mal wieder meine eigene Schusseligkeit natürlich hat er durch 0 dividiert daher das Resultat. Das war nicht einfach zu sehen da der gdb leider keine Werte ynamischer Arrays anzeigen kann zumindest zeigt er keine an bei CodeBlocks sondern nur eine Adresse.

mfg
 
Zuletzt bearbeitet:
Mir ist trotzdem ein komisches Verhalten unter die Augen gekommen und zwar konkret bei
(11 / 3) mein Taschenrechner kürzt sinnvollerweise auch auf 3,666666667
und mein Rechner auf 3,6666666666666665.

Frage: Mein Taschenrechner erkennt das automatisch das wenn ich nun wieder mal 3 rechne das Ergebnis 11 ergibt aber der Rechner wird das wohl nicht so machen :confused: zumal zeigt mein Testversuch es so an.

Im Beispiel:
z = -(11/-3) = 11/3 beim Rechner 3,6666666666666665
z * -3 + 11 sollten 0 ergeben beim Rechner 0,000000000000xx

Lässt sich sowas vermeiden ? Wenn ja wie ? Wenn ich z.B. die Determinate berechne oder den Rang und der Wert 0 dort eine wichtige Rolle spielt dann sieht man die Probleme denn 0,0000000000000000x ist eben nicht 0 :rolleyes:

mfg
 
Im Beispiel:
z = -(11/-3) = 11/3 beim Rechner 3,6666666666666665
z * -3 + 11 sollten 0 ergeben beim Rechner 0,000000000000xx

Lässt sich sowas vermeiden ? Wenn ja wie ? Wenn ich z.B. die Determinate berechne oder den Rang und der Wert 0 dort eine wichtige Rolle spielt dann sieht man die Probleme denn 0,0000000000000000x ist eben nicht 0 :rolleyes:
Wenn du nur mit Ganzzahlen rechnest, dann kannst du sowas vermeiden, indem du Brüchen statt Fließkommazahlen verwendest. Ansonsten solltest du dich mal in die Darstellung von Fließkommazahlen (und den damit verbundenen Rundungsfehlern) einlesen. Direkte Vergleiche einer Fließkommazahl mit einer Konstanten (hier 0) sollte man tunlichst vermeiden, arbeite stattdessen mit einer Epsilonumgebung.

Grüße,
Matthias
 
Vielen Dank dann werde ich mir mal die "Epsilonumgebung" anschauen. Das mit den "Rundungsfehlern" ist mir schon klar, das liegt an der Architektur der CPU usw. wollte nur mal ein Tip haben :)
Mit Brüchen zu rechnen damit meinst du wahrscheinlich eine Klasse anlegen mit Zähler und Nenner usw. ?
Naja mal schaun was die Epsilonumgebung ist bzw. wie man damit umgeht und dann werd weitersehn.

:)
 
Zurück