Hallo Daniela,
Beim Sinus kann man wirklich net viel einsparen, hab ich gerade feststellen müssen, weil da kommt man um die FPU net herum (glaub ich zumindest, so gut bin ich in Mathe auch net).
tatsächlich? Ich hab vor Jahren mal für eine Grafikanwendung, bei der es auch nicht auf absolute Genauigkeit ankam, eine schnelle Sinusfunktion in Assembler geschrieben. Der wesentliche Knackpunkt war, dass ich eine Tabelle mit Stützpunkten (wegen der Symmetrie reicht der Bereich 0..90°) verwendet habe und Werte dazwischen einfach linear interpoliert habe. Damit reduzierte sich eine "Sinus"-Berechnung auf einen Arrayzugriff, eine Verhältnisbildung und eine Addition.
Na gut, ich hab halt was gegen solche Tabellen in meinen Implementationen. Vielleicht bin ich einfach nur zu faul um sie anzulegen. Aber jetzt wo du es erwähnst, wenn man viele Sinusberechnungen machen muss, kann man die Tabellen ja zu Beginn generieren.
Ganzzahl-Wurzelziehen von großen Zahlen kann dagegen sehr schnell gehen, sofern man es nur näherungsweise braucht (wenn die Zahl nur gerade Bits hat, ist es sogar ganz exakt).
Wie meinst du das? Dass nur gerade Zweierpotenzen auftreten? Etwa sowas wie
84 = 2^6 + 2^4 + 2^2 ?
Dann verrate mir doch bitte mal, wie du die Wurzel aus 84 "ganz exakt" berechnen willst. Nee, es interessiert mich ehrlich, auch wenn das jetzt vielleicht spöttisch klingen mag.
Okay, mit den geraden Bits hab ich mich etwas vertan. Ich meinte, die Exponenten in den Zweierpotenzen müssen wieder Zweierpotenzen sein, weil dann "geht die Wurzel auf". Oder so. Wie gesagt, ich bin kein Mathegenie. Mir war nur einmal langweilig, und da hab ich versucht, im Hexadezimaleditor ganzzahlige Wurzeln zu ziehen, das war alles. Aber die Abweichungen sind teilweise noch sehr groß, da ist viel Raum für Verbesserung.
Doch, kann man. Sehr gut sogar, dafür gibt's eigene OPcodes, und jeder, der direkt mit der FPU arbeitet, kommt um die wohl net herum. Damit verschiebt man doch eigentlich nur das Komma um eine Binärstelle, mehr ist es nicht.
Und das geht in Assembler sogar ohne FPU schnell und effizient. :-)
Weiß ich. Ich hab bis jetzt noch überhaupt kein Programm geschrieben, wo ich kein Bit-Shifting verwendet hab. Und ich hab so eine Aversion gegen Divisionen in Schleifen, ich versuche so weit es geht nur durch Zweierpotenzen zu dividieren.