Skip to content

Fast math functions

Giulio Moro edited this page Oct 10, 2016 · 5 revisions

When programming in C++ on Bela, you have access to a library of fast, approximated math function: math_neon. This is a library that aims at replacing the accurate math functions implemented by the libmath library with faster, optimized and less accurate functions.

In order to use it, you will have to add

#include <math_neon.h>

at the top of your file and then you can invoke the functions by adding _neon at the end of the name of a regular math.h function, e.g.: sinf(float) becomes sinf_neon(float)

Being these functions approximate, they may not suit all purposes and it is up to you to verify that they are accurate for your specific case. A list of the supported functions and a summary benchmark is in the table below. "rate" is the relative improvement of the "fast" version compared to the one in libmath.

Function |Range |Number |ABS Max Err |REL Max Err(%) |RMS Err |Time |Rate |----------| -----------| ----------| -----------|----------| -----------| -----| -------| -----| sinf |-3.14, 3.14 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |262041 |1.00 | sinf_neon |-3.14, 3.14 |500000 | 0.00000083 | 0.85972977 | 0.00000041 |66440 |3.94 | cosf |-3.14, 3.14 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |215722 |1.00 | cosf_neon |-3.14, 3.14 |500000 | 0.00000083 | 0.67412275 | 0.00000042 |77271 |2.79 | tanf |-0.79, 0.79 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |250169 |1.00 | tanf_neon |-0.79, 0.79 |500000 | 0.00000191 | 0.00036218 | 0.00000067 |97411 |2.57 | asinf |-1.00, 1.00 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |229272 |1.00 | asinf_neon |-1.00, 1.00 |500000 | 0.00004661 | 0.00889725 | nan |121673 |1.88 | acosf |-1.00, 1.00 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |277243 |1.00 | acosf_neon |-1.00, 1.00 |500000 | 0.00004673 | 0.00634698 | nan |123174 |2.25 | atanf |-1.00, 1.00 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |206506 |1.00 | atanf_neon |-1.00, 1.00 |500000 | 0.00016665 | 0.02123393 | 0.00007395 |89627 |2.30 | sinhf |-3.14, 3.14 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |313378 |1.00 | sinhf_neon |-3.14, 3.14 |500000 | 0.00000191 | 0.15247960 | 0.00000019 |75931 |4.13 | coshf |-3.14, 3.14 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |327628 |1.00 | coshf_neon |-3.14, 3.14 |500000 | 0.00000191 | 0.00002146 | 0.00000017 |75932 |4.31 | tanhf |-3.14, 3.14 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |322052 |1.00 | tanhf_neon |-3.14, 3.14 |500000 | 0.00000024 | 0.24726489 | 0.00000005 |74937 |4.30 | expf |0.00, 10.00 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |288120 |1.00 | expf_neon |0.00, 10.00 |500000 | 0.00976562 | 0.00006549 | 0.00164461 |51935 |5.55 | logf |1.00, 1000.00 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |220097 |1.00 | logf_neon |1.00, 1000.00 |500000 | 0.00000763 | 0.01027698 | 0.00000107 |52387 |4.20 | log10f |1.00, 1000.00 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |273479 |1.00 | log10f_neon |1.00, 1000.00 |500000 | 0.00000334 | 0.00668141 | 0.00000048 |52388 |5.22 | floorf |1.00, 1000.00 |5000000 | 0.00000000 | 0.00000000 | 0.00000000 |566063 |1.00 | floorf_neon |1.00, 1000.00 |5000000 | 0.00000000 | 0.00000000 | 0.00000000 |339748 |1.67 | ceilf |1.00, 1000.00 |5000000 | 0.00000000 | 0.00000000 | 0.00000000 |617084 |1.00 | ceilf_neon |1.00, 1000.00 |5000000 | 0.00000000 | 0.00000000 | 0.00000000 |339745 |1.82 | fabsf |1.00, 1000.00 |5000000 | 0.00000000 | 0.00000000 | 0.00000000 |332227 |1.00 | fabsf_neon |1.00, 1000.00 |5000000 | 0.00000000 | 0.00000000 | 0.00000000 |226497 |1.47 | sqrtf |1.00, 1000.00 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |152492 |1.00 | sqrtf_neon |1.00, 1000.00 |500000 | 0.00000763 | 0.00002913 | 0.00000160 |53386 |2.86 | invsqrtf |1.00, 1000.00 |500000 | 0.00000000 | 0.00000000 | 0.00000000 |54986 |1.00 | invsqrtf_neon |1.00, 1000.00 |500000 | 0.00000012 | 0.00002124 | 0.00000000 |38418 |1.43 | atan2f |0.10, 10.00 |10000 | 0.00000000 | 0.00000000 | 0.00000000 |511718 |1.00 | atan2f_neon |0.10, 10.00 |10000 | 0.00016665 | 0.02124334 | 0.00000000 |203125 |2.52 | powf |1.00, 10.00 |10000 | 0.00000000 | 0.00000000 | 0.00000000 |1783204 |1.00 | powf_neon |1.00, 10.00 |10000 |136192.00000000 | 0.00587880 | 0.00000000 |201172 |8.86 | fmodf |1.00, 10.00 |10000 | 0.00000000 | 0.00000000 | 0.00000000 |140625 |1.00 | fmodf_neon |1.00, 10.00 |10000 | 9.97472000 | 0.08058017 | 0.00000000 |148437 |0.95 |

Clone this wiki locally