Compiler

Warum ordnet ein Compiler bei strenger Einstellung die Gleitkommaaddition (a + b) + c nicht eigenmächtig zu a + (b + c) um?

  1. AWegen Rundungsfehlern gilt das Assoziativgesetz nicht, und das Ergebnis kann sich ändern
  2. BWeil sich durch das Umordnen die Zahl der Additionen erhöht
  3. CWeil die Hardware bei Gleitkommaadditionen die Reihenfolge automatisch bestimmt
Antwort und Erläuterung anzeigen

Antwort: A. Wegen Rundungsfehlern gilt das Assoziativgesetz nicht, und das Ergebnis kann sich ändern

Bei Gleitkommaberechnungen wird das Ergebnis nach jeder Addition auf die darstellbaren Stellen gerundet, sodass eine Änderung der Berechnungsreihenfolge das Ergebnis geringfügig verändern kann. Wird z. B. eine sehr große mit einer sehr kleinen Zahl zuerst addiert, geht die kleine Zahl durch Rundung verloren, während sie erhalten bleiben kann, wenn kleine Zahlen zuerst addiert werden. Daher behält ein Compiler mit strenger Einstellung die Reihenfolge bei. Wählt man eine Einstellung, die Ergebnisunterschiede erlaubt (z. B. Fast-Math), kann zur Vektorisierung umgeordnet werden. Die Zahl der Additionen ändert sich nicht.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Compiler

  1. Welche Befehlsart wird bei der automatischen Vektorisierung des Compilers verwendet?
  2. Welche grundlegende Bedingung muss die Optimierung eines Compilers einhalten?
  3. Welche Beschreibung der Befehlsauswahl (Instruction Selection), einer Phase der Codeerzeugung, ist richtig?
  4. Welche Beschreibung eines Cross-Compilers ist richtig?
  5. Beim Untersuchen eines mit Optimierung kompilierten Programms im Debugger werden manche Variablenwerte als „nicht darstellbar“ angezeigt. Was ist der Hauptgrund?

Vergleiche zu diesem Thema