C++ Division 1 / 25

Hi,
ich hab heute etwas verdutzt feststellen müssen, dass die Division von

double test = (double) 1.0 / (double)25 

im Visual Studio c++ 2015 nicht exakt „0.04“ ergibt sondern „0.040000000000000001“.

Weiß jmd von euch wodurch die „magische“ 1 im Ergebnis der Division entsteht?

VG
patrick

Das ist ein Rundungsfehler.
Intern werden die Fließkommazahlen binär dargestellt, die Ausgabe erfolgt dezimal. Diese beiden Zahlensysteme lassen sich nicht „verlustfrei“ ineinander umrechnen, vielfach entstehen periodische Brüche, die durch Rundung abgebrochen werden müssen.

Aha, an der Stelle der Wissensaufnahme stehst Du.
Typisch, muss jeder mal lernen. 10 durch 3 und Ergebnis mal drei ist bisweilen 9,99…9
und nicht 10.

Moin,

<Kümmelspalt>
die müssen keineswegs periodisch sein - es reicht schon, wenn kein glatter Bruch entsteht.
</Kümmelspalt>

Gruß Ralf

Das mußt Du mal vorführen, wie sieht denn ein nicht-glatter, nicht-periodischer Bruch aus, dessen Existenz Du hier postulierst?

Rationale Zahlen, als Quotienten von ganzen Zahlen, sind entweder periodisch oder endlich. Das kann man z.B. mit dem erweiterten Euklidischen Algorithmus zeigen.

1 Like

Danke für den Hinweis, mir war’s beim Schreiben schon ein wenig unheimlich, weil ich - mit kleinen Zahlen - gleich auf Perioden gelaufen bin. Und für große zu faul war ';-).

Gruß Ralf

In sofern lagst Du richtig, dass das Problem nicht nur bei periodischen Brüchen existiert, sondern immer wenn irgendwo im Rechenweg mehr signifikante Stellen entstehen, als die Fließkomma-Genauigkeit hergibt.
Dazu braucht man nicht mal Division. Es reichen auch verschieden große Zahlen.

Zu beachten ist, dass Fehler nicht nur an der letzten Stelle entstehen.

In der Praxis ist die Division aber die häufigste Ursache.