eXile hat geschrieben:Krishty hat geschrieben:Eben angepackt (allerdings mit unsigned (normalized) int). Wie gut sich das anfühlt … den Quadranten eines Winkels für die eigenen trigonometrischen Funktionen bestimmen? Bloß die oberen Bits abfragen!
Das ist schön zu hören. :) Hast du dir neue Minimax-Polynome gebastelt, um die höhere Genauigkeit (in Vergleich zu
float) zu nutzen?
Nein. Zum einen sind meine Mathematikfähigkeiten bestenfalls mit
legasthenisch zusammenzufassen, so dass ich nach fünf Papern dazu immernoch keinen Plan habe, wie man auf die Dinger kommt außer durch Brute Force; zum anderen weiß ich nicht, warum Integer-Winkel andere Polynome gebrauchen können sollten als Gleitkommawinkel, und zu guter Letzt fällt es mir sehr schwer, eine anständige Referenz für die
tatsächlichen Werte zu finden.
Einsatztauglich ist bisher nur die
float tan()-Funktion, und auch die wartet noch ihre finale Prüfung ab. Obwohl die Werte absolut konsistent zu einem von Greens Papern sind, habe ich dauernd 1 ULPs Abweichung gegenüber dem
double tan() der VC-CRT gemessen, und ich weiß nicht, wer nun recht hat. Weil ich keine Arbitrary-Precision-Number-Bibliothek gefunden habe, die sich via
Download & Include direkt unter Visual Studio kompilieren ließ, hätte ich auch nicht die geringste Referenz zum Testen etwaiger
double-Implementierungen (auf die ich im Augenblick sowieso verzichten will, weil ich sonst nie mehr vorankomme).
Für heute abend habe ich mir
http://www.ganssle.com/approx.htm vorgenommen. Sieht so aus, als ob man dort gepflegt abkupfern könnte statt sich Minimax selber zu bestimmen oder das bereits außer Druck befindliche Standardwerk von Hart zum Nachschlagen zu bemühen, das jemand meiner mathematischen Bildung eh nicht bedienen könnte.
Für die Optimierung auf SSE / AVX habe ich eh keine Zeit, zumal ich den Wechsel zu Clang im Auge habe und mich Intrinsics dabei absolut abschrecken. Von nicht vektorisiertem Text, der Sinus und Cosinus desselben Winkels simultan berechnet und sich durch die Festkommadarstellung der Winkel das leidige Modulo spart, verspreche ich mir bereits mehr Leistung als von normalem seriellen
float sin(), cos().
Letztendlich geht es auch weniger um Geschwindigkeit als viel mehr um Abnabelung von der C++-Laufzeitbibliothek und darum, es richtig zu machen statt so, wie es alle tun.