From dd4779520f47e57be7180024518549e6041b2bdf Mon Sep 17 00:00:00 2001 From: Oskar Weigl Date: Thu, 27 Sep 2018 21:29:32 -0700 Subject: [PATCH] fix float rounding issue in sincos index calculation --- Source/FastMathFunctions/arm_cos_f32.c | 10 ++++++++-- Source/FastMathFunctions/arm_sin_f32.c | 14 +++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Source/FastMathFunctions/arm_cos_f32.c b/Source/FastMathFunctions/arm_cos_f32.c index e604b3c6..5b82c77d 100644 --- a/Source/FastMathFunctions/arm_cos_f32.c +++ b/Source/FastMathFunctions/arm_cos_f32.c @@ -93,8 +93,14 @@ float32_t arm_cos_f32( in = in - (float32_t) n; /* Calculation of index of the table */ - findex = (float32_t) FAST_MATH_TABLE_SIZE * in; - index = ((uint16_t)findex) & 0x1ff; + findex = (float32_t)FAST_MATH_TABLE_SIZE * in; + index = (uint16_t)findex; + + /* when "in" is exactly 1, we need to rotate the index down to 0 */ + if (index >= FAST_MATH_TABLE_SIZE) { + index = 0; + findex -= (float32_t)FAST_MATH_TABLE_SIZE; + } /* fractional value calculation */ fract = findex - (float32_t) index; diff --git a/Source/FastMathFunctions/arm_sin_f32.c b/Source/FastMathFunctions/arm_sin_f32.c index ce8b9b9b..b27960d4 100644 --- a/Source/FastMathFunctions/arm_sin_f32.c +++ b/Source/FastMathFunctions/arm_sin_f32.c @@ -78,11 +78,6 @@ float32_t arm_sin_f32( int32_t n; float32_t findex; - /* Special case for small negative inputs */ - if ((x < 0.0f) && (x >= -1.9e-7f)) { - return x; - } - /* input x is in radians */ /* Scale the input to [0 1] range from [0 2*PI] , divide input by 2*pi */ in = x * 0.159154943092f; @@ -100,9 +95,14 @@ float32_t arm_sin_f32( in = in - (float32_t) n; /* Calculation of index of the table */ - findex = (float32_t) FAST_MATH_TABLE_SIZE * in; + findex = (float32_t)FAST_MATH_TABLE_SIZE * in; + index = (uint16_t)findex; - index = ((uint16_t)findex) & 0x1ff; + /* when "in" is exactly 1, we need to rotate the index down to 0 */ + if (index >= FAST_MATH_TABLE_SIZE) { + index = 0; + findex -= (float32_t)FAST_MATH_TABLE_SIZE; + } /* fractional value calculation */ fract = findex - (float32_t) index;