Im Wesentlichen versuche ich, die im folgenden Code berechneten Werte zu verwenden, aber wenn ich die Werte in allen Objekten mit eigenen Raten speichere, füge gerade genug Bytes hinzu einen Cache-Fehler verursachen. Und die Verwendung einer Nachschlagetabelle hilft offensichtlich nicht.Schnelle Zweierpotenzen mit schwebendem Exponenten [C]
Also bin ich auf der Suche nach einem Weg, um diese Werte schneller als mit den Standard-Power-Funktionen zu bekommen, gibt es irgendwelche Tricks, die ich wegen der möglichen Eingaben sehr eingeschränkt verwenden kann?
static inline
double __attribute((pure)) get_decay_rate(uint8_t rate)
{
if(rate >= 128)
{
return 65535.0/65536.0;
}
double k = pow(2, rate/8.0);
return (k - 1.0)/k;
}
/* pseudocode:
double k = (int) pow(2, k/8.0);
k = (k - 1)/k;
return log(65535/65536)/log(k);
*/
static inline
uint16_t __attribute((pure)) get_decay_modulus(uint8_t rate)
{
if(rate <= 128)
{
return 1;
}
//turns out to be the same as the above pseudocode, for some reason.
return pow(2, (rate - 128)/8.0);
}
Und Sie haben auch versucht, in jeder Funktion ein statisches 256-langes Array zu setzen? Oder ein statisches 128-langes Array? – Hurkyl
meinst du 'rate/8.0' in' int k = pow (2, k/8.0); '? Ähnlich wie in 'get_decay_modulus' verweisen Sie auf' k', ohne es zu deklarieren. – oldrinb
@Hurkyl Da das Problem Cache-Misses ist, bedeutet das, dass weniger Code in den Cache passen kann, also verschiebt es das Problem, anstatt es zu lösen. –