Programmieren - alles kontrollieren 4.946 Themen, 20.742 Beiträge

Zeit für Integer/Floatrechnungen

RyoOhki / 28 Antworten / Flachansicht Nickles

Eine Frage zur Berechnung von Integer und Float werten unter C++:

sollte ein Programm länger brauchen, zwei Float zu addieren (z.B. via Add = 0,1 + 0,1) als zwei integerwerte (Add2 = 1 + 1 ) zu addieren, da es sich um Flieskommberechnungen handel?

ich habe ein Programm geschrieben das beide opperationen 40000000000mal ausführt und die zeit dafür stoppt, erhalte aber bei beiden beinahe identische Werte.

Ich meine, sollte ein PC Flieskommazahlen nicht langsammer berechnen können als Integerzahlen?

Grüße,
Ryo

bei Antwort benachrichtigen
Dreamforger label „Cache /Pipelineing /Register“
Optionen

Ok Klugscheisser.
Assembler code posten und Assembler code lesen und verstehen können sind zwei Dinge.
Beim nicht optimierten Code wird a noch aufaddiert:

.L2:
-- Schleifenbedingung
cmpl $40000000,-28(%ebp)
-- einsprung in die Schleife
jle .L5
-- aussprung aus der Schleife
jmp .L3
.p2align 4,,7
.L5:
-- hier kommt der eigentliche Schleifeninhalt
fldl -8(%ebp)
faddl -16(%ebp)
fstpl -24(%ebp)
.L4:
-- i++
incl -28(%ebp)
-- zur bedingung zurückspringen
jmp .L2

Beim optimierten Code wurde die Addition weggelassen weil auf das Ergebniss nicht mehr zugegriffen wird. Setz dahinter mal ein printf(...) und schau's dir nochmal an. Die Schleife ist nochimmer da, wenn auch effizienter:

-- schleifenzähler initialisieren
movl $40000000,%eax
.p2align 4,,7
.L5:
-- schleifenrelevante berechnungen
-- hier halt keine

-- schleifenzähler dekrement
decl %eax
-- rücksprung in die schleife
jns .L5

Wie soll der Compiler auch Schleifen entfernen? Dafür wäre semantisches Verständniss nötig. Und das fehlt dem Compiler. Alles was ein Compiler machen darf sind syntaktische äquivalente einzusetzen. Vieleicht greift ja ein anderer Thread auf die Variablen zu? -->volatile.
Die schleife, so wie ich sie geschrieben habe ist natürlich optimierbar. --> kleiner Gauss
Hierfür ist aber ein gewisses Mathematisches Wissen erforderlich. Der Compiler könnte auf dem selben Weg auch noch geometrische Reihen entfernen. Er könnte doch auch noch Taylorreihenentwicklungen erkennen und sie durch ihre Äquivalenten Formel ersetzen. Wann ist denn schluss mit solchen Optimierungen? Numerische Integration? Differentialgleichungen?

Nenn meine Posts nicht ungerechtfertigt Blödsinn und du kannst solche Antworten auch in einem ganz anderen Ton haben.

bei Antwort benachrichtigen