Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Berechnung trigonometrischer Funktionen


Hidden - Do 19.06.08 17:47
Titel: Berechnung trigonometrischer Funktionen
Hi,

Mir ist es seit längerer Zeit ein Ärgernis, dass sin, cos und tan im Mathematik-Unterricht als Blackbox behandelt werden. Nun sind diese Funktionen in Delphi ja im asm-Code deklariert. Es würde mich freuen, wenn jemand sin und cos in normalen Delphi-Code übersetzen würde.

Danke! :D

mfG,


Moderiert von user profile iconChristian S.: Topic aus Off Topic verschoben am Do 19.06.2008 um 18:48


Allesquarks - Do 19.06.08 19:02

Der asm code von sin cos etc ist in etwa so kompliziert:

Delphi-Quelltext
1:
2:
3:
4:
5:
function sin(x:extended):extended;
asm
  fld tbyte x;//laden in den mathematischen Coprozessor
  fsin;//sin in HArdware ausführen
end;

Du siehst also es gibt hier kein Delphi-Pendant, da es eine einzige Anweisung ist. Welcher spezielle Algorithmus da in Hardware gegossen wurde ist hardwareabhängig. Meine gehört zu haben, dass Intel für Core 2 den Algorithmus da umgestellt hat. Du kannst eine Implementierung über Taylorreihen in Delphi schreiben, wenn du dabei aber selbst "nur" die hardware Fließkomma benutzt denke ich würdest du die Werte verschlimmbessern. Ich weiß auch, dass in Hardware meist nicht die Tylorreihen verdrahtet sind, da sie zu langsam sind.


delfiphan - Do 19.06.08 19:57

Der Sinus wird normalerweise auf einem kleinen Intervall [0,pi/2] iterativ numerisch berechnet oder tabelliert und geschickt interpoliert, die Werte in anderen Intervallen werden durch Spiegelung etc. ermittelt.


Sinspin - Do 19.06.08 20:55

Im guten alten Turbo Pascal gab es einen Compilerschalter mit dem man Programme so übersetzen konnte das sie ohne CoProzessor auskamen. Wer also über eine Vollversion mit allen Quelltexten verfügt, müsste mit einigem stöbern über die Sinus Implementierung stolpern.


delfiphan - Do 19.06.08 22:20

Es ist jedenfalls nicht so, dass du viel über den Sinus aus der Implementation lernst. Bei Hardwareimplementationen wird oft getrickst.

Eine Möglichkeit: Eine Tabelle von Drehmatrizen (oder komplexen Zahlen), womit man einen Einheitsvektor um +45, +22.5, +11.25, +5.625, ... drehen kann. Die Winkel werden dann so kombiniert und hintereinander angewendet, bis der Einheitsvektor genau um den eingegebenen Winkel gedreht wurde. Aus der Rechnung erhält man dann Sinus und Cosinus gleichzeitig.


BenBE - Do 19.06.08 22:25

Siehe http://de.wikipedia.org/wiki/CORDIC