Multiplikation von Rationalen Zahlen NUR durch ADDITION
-
Hallo,
ich befasse mich gerade eben mit einem sehr speziallen Problem.
Die Multiplikation von Natürlichen Zahlen lässt sich ohne Weiteres durch eine Addition realisieren.
Doch wie funktioniert das bei Rationalen Zahlen?double a = 2.8;
double b = 4.21;
double c = 18.3;a += b * c
Wie kann ich die Multiplikation b * c durch eine Addition am geschicktesten ersetzen?
Ich möchte eine 3-fach verschachtelte For-Schleife optimieren.
Um das 40-fache konnte ich die Performance bereits steigern - nun möchte ich noch den letzten MFLOP aus dem Konstrukt herauskitzelnIch freuen mich schon auf eure Anregungen!
-
Könntest du mal den Code voher/nachher zeigen, dessen Performance du mit so etwas um das 40-Fache steigern konntest?
-
cooky451 schrieb:
Könntest du mal den Code voher/nachher zeigen, dessen Performance du mit so etwas um das 40-Fache steigern konntest?
Mir geht es nur um die Multiplikation.
Die anderen Optimierungsschritte sind nur ein Beiwerk.
* Blocking
* Unrolling
* etc;
-
Du möchtest also wissen, wie man am schnellsten bc rechnen kann? Dann frag das doch gleich, anstatt schon vorzugeben, wie du glaubst, dass es am schnellsten ginge. Die Antwort ist nämlich ziemlich einfach: bc.
Noch eine Nebenbemerkung: Wenn du zuvor eine Rechnung b*c mit ganzen Zahlen durch eine Zerlegung in Additionen beschleunigen konntest, dann hast du bereits irgendwo großen Mist gemacht. Denn das sollte eigentlich sehr viel langsamer sein. Oder du hast einen ganz grottigen Compiler für eine exotische Umgebung. Egal welches der beiden Szenarien, da dran sollte man Arbeiten.
* Unrolling
Macht ein (guter) Compiler.
* etc;
Macht ein (guter) Compiler.
-
Das der Compiler das kann ist mir klar.
Mir geht es darum zu verstehen wie und was da genau optimiert wird.
Daher habe ich dem Compiler jegliche eigenständige Optimierung untersagt.
Für mich ist das nur ein kleiner Zeitvertreib
-
cHunter schrieb:
Mir geht es darum zu verstehen wie und was da genau optimiert wird.
Wo wird denn hier etwas optimiert? Falls dein Compiler daraus (egal ob Ganzzahl oder Fließkomma) etwas anderes macht als die Multiplikationsanweisung der CPU, dann
a) weiß er etwas, dass du uns verschweigst, z.B. dass eine der Zahlen immer 2 ist
oder
b) hat die Plattform keine MultiplikationUnd wenn du siehst, was er stattdessen macht, dann weißt du doch schon was er macht.
Also anders gesagt: Was möchtest du überhaupt wissen?
-
double a = 2.8;
a mit 10 multiplizieren, in ein Int umwandeln, dann auf deine Natürliche Zahlen Methode mit dem anderen Wert, der auch in Int umgewandelt wurde, multiplizieren und das Ergebnis wieder durch 10 Teilen.
-
Schlauste im Forum schrieb:
a mit 10 multiplizieren, in ein Int umwandeln, dann auf deine Natürliche Zahlen Methode mit dem anderen Wert, der auch in Int umgewandelt wurde, multiplizieren und das Ergebnis wieder durch 10 Teilen.
Ich habe meine Zweifel, dass eine Multiplikation gefolgt von mehreren Additionen gefolgt von einer Division schneller ist als eine Multiplikation allein.