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

Répondre à