Klaro, ne FPU gibt's ja nicht bei AVR.Zitat von ragnar
Was willst du mit exp(). Über C zu rechnen macht dir nur Overhead. Du weisst doch, daß deine Werte in R liegen. Für eine Multiplikation in C brauchst du immerhin 3 Multiplikationen über R.Zitat von ragnar
Für atan() hast du
atan(x) = Pi/2 - atan(1/x)
atan(x) = -atan(-x)
was schon mal das Intervall auf [0,1] begrenzt. Falls du über die Taylorreihe um 0 von atan() gehen willst ist das schlecht, denn am Rande des Konvergenzradius ist die Konvergenz echt mies.
Evtl hilft das Additionstheorem
atan x + atan y = atan ((x+y)/(1-xy)), |x| << 1, |y| << 1
also
atan x = 1/2 * atan (2x / (1-x^2)) mit |x| << 1
oder so ähnlich
Wenn man das wiederholt anwendet und den atan() um 0 linearisiert, also atan x = x nimmt, bekommt man den atan() ebenfalls raus. Allerdings muss man Wurzeln ziehen, wenn ich mich recht erinnere. Ne Wurzel zu ziehen wiederum ist nicht viel mehr Aufwand als ein paar Divisionen.
Noch ein Tipp:
Wenn du 2 Zahlen multipliziertst, etwa 2 16-bit-Werte in 8-bit-Darstellung, dann musst du auswerten
P = (B*a1+a0)*(B*b1+b0)
Dabei ist B die Basis (hier 2^8) und a1, a0, b1, b0 sind die Ziffern zur Basis B.
Das auszumultiplizieren:
P = B^2*a1*b1 + B*(a1*b0 + a0*b1) + a0*b0
= B^2*c2 + B*c1 + c0
So gerechnet, kostet das 4 Multiplikationen, und die sind teuer. (Multiplikation mit der Basis ist trivial).
Wenn du hinschreibst
ck = (a1+a0)*(b1+b0) = a1*b1 + a1*b0 + a0*b1 + a0*b0
c2 = a1*b1
c0 = a0*b0
hast du
P = B^2*c2 + B*(ck-c2-c0) + c0,
was dich nur noch Multiplikationen kostet. Die Idee -- allerdings für große Zahlen mit mehreren hundert Stellen -- stammt von Karatsuba. Allerdings musst du etwas Acht geben, weil die Koeffizienten noch nicht auf 0 <= B < ci normiert sind.
Lesezeichen