0 Daumen
878 Aufrufe

Kann mir einer sagen wieso 68.0 rauskommt?

17.0 / (5 / 3) * 4

Avatar von

So sieht die ausBild Mathematik

Und welcher Deutungsrahmen soll unterstellt werden, damit das Ergabnis \(68.0\) lautet? Vielleicht: "Ignoriere alle geklammerten Teilausdrücke!"?

Gemeint ist vermutlich der ganzzahlige Teil des Resultats einer Division ohne Nachkommastellen, also 5/3 = 1.

Hallo nn! Das ist denkbar, wäre dann aber bei einer Auswertung von links nach rechts ein wenig ungewöhnlich und wirkt so, als ob die Deutung der Aufgabe passend zum Ergebnis getrimmt werden soll.

Die Klammer wird zuerst ausgewertet. Der Compiler/Interpret findet eine Division mit zwei Ganzzahlen und liefert deswegen wieder eine Ganzzahl (truncating division).

(0x05 / 0x03)  -> 0x01

Und erst im nächsten Schritt durch die Division wird das Ergebnis als Fließkommazahl interpretiert.

Versucht man es mit 17.0/(5/3.0)*4 oder 17.0/(5.0/3)*4, dann sollte das richtige Ergebnis heraus kommen.

3 Antworten

+2 Daumen
 
Beste Antwort

Die Zahl 17.0 ist eine Realzahl.

Die Zahlen 5, 3 und 4 sind Ganzzahlen.

Der Bruch 5/3 besteht aus zwei Ganzzahlen und wird dann durch eine ganzzahlige Division berechnet, mit 5/3 = 1 (da die Nachkommastellen ignoriert werden).

Damit gilt 17.0 / (5 / 3) * 4 = 17.0 / 1 * 4 = 68.0

So weit die völlig falsche Theorie.

Es steht nämlich ausdrücklich in der Originaldokumentation von C, dass

(a) die Reihenfolge mathematischer Ausdrücke durch den Parser beliebig geändert werden kann (natürlich nur, solange nicht gegen math. Regeln verstoßen wird);

(b) die Typumwandlung ebenfalls beliebig geändert werden kann.

D.h.

Vielleicht rechnet der Compiler zuerst 4*3 = 12, dann 12/5 = 2 (ganzzahlig), dann 17.0*2 = 34.0.

Vielleicht erkennt der Compiler als erstes die Zahl 17.0 als Realzahl und wandelt dann alle weiteren Berechnungen ebenfalls in Realzahlen um, was dann zu 17.0 / (5.0 / 3.0) * 4.0 = 40.8 führt. Dabei kann er die Reihenfolge ebenfall nach Lust und Laune ändern, aber das ist hier sowieso egal.

Tatsache ist, dass Du nicht weißt, was der Compiler macht, und demzufolge kannst Du auch nicht sagen, welches Ergebnis herauskommt. Und demzufolge soltest Du so etwas auch nie programmieren.

Avatar von
0 Daumen

Tut es das?                                      

Avatar von
0 Daumen

Wie lautet die Aufgabe genau?

Bild Mathematik

Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community