Commit from zer0 on branch b_zer0 (2009-02-02 23:21 CET) =================================
Fix an ugly bug in u64_sqrt, u32_sqrt, u16_sqrt : if number is 0, the function will loop forever. Thanks to serpilliere for that. aversive modules/devices/control_system/filters/quadramp/quadramp.c 1.4.4.6 aversive modules/base/math/fixed_point/f64_sqrt.c 1.5.4.4 aversive modules/base/math/fixed_point/f32_sqrt.c 1.5.4.4 aversive modules/base/math/fixed_point/f16_sqrt.c 1.5.4.4 =================================================================== aversive/modules/devices/control_system/filters/quadramp/quadramp.c (1.4.4.5 -> 1.4.4.6) =================================================================== @@ -15,32 +15,19 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Revision : $Id: quadramp.c,v 1.4.4.5 2007-12-31 16:25:00 zer0 Exp $ + * Revision : $Id: quadramp.c,v 1.4.4.6 2009-02-02 22:21:20 zer0 Exp $ * */ #include <stdio.h> #include <string.h> +#include <math.h> #include <aversive.h> #include <quadramp.h> #define NEXT(n, i) (((n) + (i)/(n)) >> 1) -static uint32_t u32_sqrt(uint32_t number) { - uint32_t n = 1; - uint32_t n1 = NEXT(n, number); - - while(ABS(n1 - n) > 1) { - n = n1; - n1 = NEXT(n, number); - } - while((n1*n1) > number) { - n1 -= 1; - } - return n1; -} - void quadramp_init(struct quadramp_filter * q) { uint8_t flags; @@ -118,7 +105,7 @@ int32_t ramp_pos; /* var_2nd_ord_neg < 0 */ /* real EQ : sqrt( var_2nd_ord_neg^2/4 - 2.d.var_2nd_ord_neg ) + var_2nd_ord_neg/2 */ - ramp_pos = u32_sqrt( (var_2nd_ord_neg*var_2nd_ord_neg)/4 - 2*d*var_2nd_ord_neg ) + var_2nd_ord_neg/2; + ramp_pos = sqrt( (var_2nd_ord_neg*var_2nd_ord_neg)/4 - 2*d*var_2nd_ord_neg ) + var_2nd_ord_neg/2; if(ramp_pos < var_1st_ord_pos) var_1st_ord_pos = ramp_pos ; @@ -129,7 +116,7 @@ /* var_2nd_ord_pos > 0 */ /* real EQ : sqrt( var_2nd_ord_pos^2/4 - 2.d.var_2nd_ord_pos ) - var_2nd_ord_pos/2 */ - ramp_neg = -u32_sqrt( (var_2nd_ord_pos*var_2nd_ord_pos)/4 - 2*d*var_2nd_ord_pos ) - var_2nd_ord_pos/2; + ramp_neg = -sqrt( (var_2nd_ord_pos*var_2nd_ord_pos)/4 - 2*d*var_2nd_ord_pos ) - var_2nd_ord_pos/2; /* ramp_neg < 0 */ if(ramp_neg > var_1st_ord_neg) ================================================= aversive/modules/base/math/fixed_point/f64_sqrt.c (1.5.4.3 -> 1.5.4.4) ================================================= @@ -15,7 +15,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Revision : $Id: f64_sqrt.c,v 1.5.4.3 2008-05-10 15:06:26 zer0 Exp $ + * Revision : $Id: f64_sqrt.c,v 1.5.4.4 2009-02-02 22:21:20 zer0 Exp $ * */ @@ -29,6 +29,9 @@ uint64_t n = 1; uint64_t n1 = NEXT(n, number); + if (number == 0) + return 0; + while(ABS(n1 - n) > 1) { n = n1; n1 = NEXT(n, number); ================================================= aversive/modules/base/math/fixed_point/f32_sqrt.c (1.5.4.3 -> 1.5.4.4) ================================================= @@ -15,7 +15,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Revision : $Id: f32_sqrt.c,v 1.5.4.3 2008-05-10 15:06:26 zer0 Exp $ + * Revision : $Id: f32_sqrt.c,v 1.5.4.4 2009-02-02 22:21:20 zer0 Exp $ * */ @@ -25,10 +25,14 @@ #define NEXT(n, i) (((n) + (i)/(n)) >> 1) -static uint32_t u32_sqrt(uint32_t number) { +static uint32_t u32_sqrt(uint32_t number) +{ uint32_t n = 1; uint32_t n1 = NEXT(n, number); + if (number == 0) + return 0; + while(ABS(n1 - n) > 1) { n = n1; n1 = NEXT(n, number); ================================================= aversive/modules/base/math/fixed_point/f16_sqrt.c (1.5.4.3 -> 1.5.4.4) ================================================= @@ -15,7 +15,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Revision : $Id: f16_sqrt.c,v 1.5.4.3 2008-05-10 15:06:26 zer0 Exp $ + * Revision : $Id: f16_sqrt.c,v 1.5.4.4 2009-02-02 22:21:20 zer0 Exp $ * */ @@ -30,6 +30,9 @@ uint16_t n = 1; uint16_t n1 = NEXT(n, number); + if (number == 0) + return 0; + while(ABS(n1 - n) > 1) { n = n1; n1 = NEXT(n, number); _______________________________________________ Avr-list mailing list Avr-list@droids-corp.org CVSWEB : http://cvsweb.droids-corp.org/cgi-bin/viewcvs.cgi/aversive WIKI : http://wiki.droids-corp.org/index.php/Aversive DOXYGEN : http://zer0.droids-corp.org/doxygen_aversive/html/ BUGZILLA : http://bugzilla.droids-corp.org COMMIT LOGS : http://zer0.droids-corp.org/aversive_commitlog