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
[email protected]
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