Fix fixed-point testilog2.
authorTimothy B. Terriberry <tterribe@xiph.org>
Mon, 6 Aug 2012 17:01:27 +0000 (10:01 -0700)
committerGregory Maxwell <greg@xiph.org>
Mon, 6 Aug 2012 17:08:11 +0000 (13:08 -0400)
Use exact integer operations to confirm the value returned is the
 correct one.

celt/tests/test_unit_mathops.c

index 8119bc1..9673de6 100644 (file)
@@ -209,10 +209,17 @@ void testilog2(void)
    opus_val32 x;
    for (x=1;x<=268435455;x+=127)
    {
-      opus_val32 error = abs(celt_ilog2(x)-(int)floor(log2(x)));
-      if (error!=0)
+      opus_val32 lg = celt_ilog2(x);
+      if (lg<0 || lg>=31)
       {
-         printf("celt_ilog2 failed: celt_ilog2(x)!=floor(log2(x)) (x = %d, error = %d)\n",x,error);
+         printf("celt_ilog2 failed: 0<=celt_ilog2(x)<31 (x = %d, celt_ilog2(x) = %d)\n",x,lg);
+         ret = 1;
+      }
+      opus_val32 y = 1<<lg;
+
+      if (x<y || (x>>1)>=y)
+      {
+         printf("celt_ilog2 failed: 2**celt_ilog2(x)<=x<2**(celt_ilog2(x)+1) (x = %d, 2**celt_ilog2(x) = %d)\n",x,y);
          ret = 1;
       }
    }