Close

create a fast lookup table for squaring numbers if you know the range

A project log for faster speed: how Optimize math and process tasks

how to make math, and other processes faster for specific tasks on any processor. and logs of examples of math performance

jamesdanielvjamesdanielv 09/08/2019 at 15:200 Comments

I recently had some math optimizations that required improving the performance of POW operations. 

these numbers were only of powers of 2. and only went up to 48.

this is currently about 100x the speed of the normal method. it would be 1000x or more but it is not in ram.

so i created a table, and decided the fastest way to store them without using much memory was to create this table so it would be in progmem, for Arduino that is stored in its flash for review later.

this may be modified further with a predictive cache, or a compressed table store as getting values returned from flash is slower than ram, and ram is valuable on Arudino. for processors with ram to spare this table should be located in ram. 

here is the function that pulls values to be used in equations. this table processes 2^x with x being 0 to 63

float SimplePowFast2s(uint8_t x){//we cause 2^x

return pgm_read_float_near(power_of2table+ x);

}

here is the table

const float power_of2table[] PROGMEM = { 
1,
2,
4,
8,
16,
32,
64,
128,
256,
512,
1024,
2048,
4096,
8192,
16384,
32768,
65536,
131072,
262144,
524288,
1048576,
2097152,
4194304,
8388608,
16777216,
33554432,
67108864,
134217728,
268435456,
536870912,
1073741824,
2147483648,
4294967296,
8589934592,
17179869184,
34359738368,
68719476736,
137438953472,
274877906944,
549755813888,
1099511627776,
2199023255552,
4398046511104,
8796093022208,
17592186044416,
35184372088832,
70368744177664,
140737488355328,
281474976710656,
562949953421312,
1125899906842624,
2251799813685248,
4503599627370496,
9007199254740992,
18014398509481984,
36028797018963970,
72057594037927940,
144115188075855870,
288230376151711740,
576460752303423500,
1152921504606847000,
2305843009213694000,
4611686018427388000,
9223372036854776000,
};

Discussions