Mal ganz abgesehen davon, daß
Code:
(int) exp ((double) t/tau)
funktionieren sollte...
Was du willst in eine geometrische Progression, d.h. zwei aufeinander folgende Werte haben immer den gleichen Quotienten.
Nehmen wir mal an, du begnügst dich mit einem duty von 16 Bit, also Werten 0...0xffff. Nehmen wir weiterhin an, zwei aufeinanderfolgende Werte haben einen Quotienten von 1.01. Auf 0xffff folgt also 0xfd76. Zwei benachbarte Werte sind also durch 1.01 zu teilen, was hier gleichbedeutend damit ist, sie mit 0x10000/1.01 = 0xfd77 zu multiplizieren. Wir haben also 16-Bit Werte, bei denen wir alle 16 Bits als Nachkommastellen interpretieren. Multiplizieren wir zwei dieser Werte, haben wir 32 Bit Nachkommastellen, und schieben das Ergebnis der Mul daher um 16 nach rechts:
Code:
extern uint16_t fixprod16 (const uint16_t, const uint16_t); // Prototyp für *.h
uint16_t fixprod16 (const uint16_t a, const uint16_t b)
{
uint32_t ab = (uint32_t) a*b;
return ab >> 16;
}
Der Nachfolger von x ist dann
Code:
fixprod16 (x, 0x10000/1.01)
Das ist auf jeden Fall deutlich effizienter als Geschütze wie exp.
Als Argumente von fixprod16 gehen natürlich auch Werte, die nicht zur Compilezeit bekannt sind.
Lesezeichen