1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

imath: add sqrti() function

This commit is contained in:
Benjamin Valentin 2023-03-22 14:08:52 +01:00 committed by Benjamin Valentin
parent 69a6b3cb14
commit eefa1b86b5

View File

@ -27,12 +27,12 @@
extern "C" {
#endif
#define ISIN_PERIOD 0x8000 /**< Period of the isin() function */
#define ISIN_MAX 0x1000 /**< Max value of the isin() function */
#define ISIN_MIN -0x1000 /**< Min value of the isin() function */
#define SINI_PERIOD 0x8000 /**< Period of the fast_sini() function */
#define SINI_MAX 0x1000 /**< Max value of the fast_sini() function */
#define SINI_MIN -0x1000 /**< Min value of the fast_sini() function */
/**
* @brief Internal isin/icos helper function
* @brief Internal fast_sini/fast_cosi helper function
* @internal
*
* @param[in] x Input parameter
@ -66,7 +66,7 @@ int32_t _ihelp(int32_t x)
* @param x angle (with 2^15 units/circle)
* @return sine value (-2^12 y 2^12)
*/
static inline int32_t isin(int32_t x)
static inline int32_t fast_sini(int32_t x)
{
static const int32_t qN = 13;
@ -83,16 +83,40 @@ static inline int32_t isin(int32_t x)
* @param x angle (with 2^15 units/circle)
* @return sine value (-2^12 y 2^12)
*/
static inline int32_t icos(int32_t x)
static inline int32_t fast_cosi(int32_t x)
{
static const int32_t qN = 13;
int32_t c = (x + (ISIN_PERIOD >> 2)) << (30 - qN);
int32_t c = (x + (SINI_PERIOD >> 2)) << (30 - qN);
int32_t y = _ihelp(x);
return c >= 0 ? y :-y;
}
/**
* @brief Square root of an integer
*
* @param x unsigned integer value
* @return square root of @p x
*/
static inline unsigned sqrti(unsigned x)
{
if (x <= 1) {
return x;
}
/* initial estimate */
unsigned y0 = x >> 1;
unsigned y1 = (y0 + x / y0) >> 1;
while (y1 < y0) {
y0 = y1;
y1 = (y0 + x / y0) >> 1;
}
return y0;
}
#ifdef __cplusplus
}
#endif