Remove .gitignore do nothing is ignored.
[synfig.git] / ETL / trunk / test / fixed.cpp
index 030b5c7..965a8d3 100644 (file)
@@ -1,9 +1,10 @@
 /*! ========================================================================
 ** Extended Template and Library Test Suite
 ** Fixed-Point Math Test
-** $Id: fixed.cpp,v 1.1.1.1 2005/01/04 01:31:48 darco Exp $
+** $Id$
 **
 ** Copyright (c) 2002 Robert B. Quattlebaum Jr.
+** Copyright (c) 2007 Chris Moore
 **
 ** This package is free software; you can redistribute it and/or
 ** modify it under the terms of the GNU General Public License as
@@ -35,7 +36,7 @@
 
 #define ADD_SUB_TEST   20000000
 #define MUL_TEST               10000000
-#define DIV_TEST               10000000
+#define DIV_TEST               1048573 // at 1048573, fixed point numbers wrap around to zero
 using namespace etl;
 
 /* === C L A S S E S ======================================================= */
@@ -53,140 +54,65 @@ struct speed_test
                MyTimer.reset();
                for(i=0;i<ADD_SUB_TEST;i++)
                {
-                       a+=a;
-                       a+=b;
-                       a-=c;
-                       a-=a;
-
-                       a+=a;
-                       a+=b;
-                       a-=c;
-                       a-=a;
-
-                       a+=a;
-                       a+=b;
-                       a-=c;
-                       a-=a;
-
-                       a+=a;
-                       a+=b;
-                       a-=c;
-                       a-=a;
-
-                       a+=a;
-                       a+=b;
-                       a-=c;
-                       a-=a;
-
-                       a+=a;
-                       a+=b;
-                       a-=c;
-                       a-=a;
-
-                       a+=a;
-                       a+=b;
-                       a-=c;
-                       a-=a;
-
+                       a+=a; a-=b; a-=c; a+=a;
+                       a+=a; a-=b; a-=c; a+=a;
+                       a+=a; a-=b; a-=c; a+=a;
+                       a+=a; a-=b; a-=c; a+=a;
+                       a+=a; a-=b; a-=c; a+=a;
+                       a+=a; a-=b; a-=c; a+=a;
+                       a+=a; a-=b; a-=c; a+=a;
                }
-               
-               
+
+               fprintf(stderr, "[%1d]...", int(int(a)/1e9)+5); // so the compiler doesn't optimize everything out
                return MyTimer();
        }
 
        double mul_test(void)
        {
                value_type a,b,c,d;
-               a=value_type(0.25);
+               a=value_type(2.25);
                b=value_type(2);
                c=value_type(4.5);
-               const value_type half(static_cast<value_type>(0.5));
+               d=value_type(1);
+               const value_type one_and_a_half(static_cast<value_type>(1.5));
                int i;
                etl::clock MyTimer;
                MyTimer.reset();
-               for(i=0;i<MUL_TEST;i++)
-               {                       
-                       d*=a;d*=b;d*=c;d*=3;d*=i;
-                       b*=c;b*=d;b*=d;b*=3;
-                       c*=d;c*=half;c*=a;c*=b;c*=3;
-                       a*=c;a*=b;a*=3;
-
-                       d*=a;d*=b;d*=c;d*=3;d*=i;
-                       b*=c;b*=d;b*=d;b*=3;
-                       c*=d;c*=half;c*=a;c*=b;c*=3;
-                       a*=c;a*=b;a*=3;
-
-                       d*=a;d*=b;d*=c;d*=3;d*=i;
-                       b*=c;b*=d;b*=d;b*=3;
-                       c*=d;c*=half;c*=a;c*=b;c*=3;
-                       a*=c;a*=b;a*=3;
-
-                       d*=a;d*=b;d*=c;d*=3;d*=i;
-                       b*=c;b*=d;b*=d;b*=3;
-                       c*=d;c*=half;c*=a;c*=b;c*=3;
-                       a*=c;a*=b;a*=3;
-
-                       d*=a;d*=b;d*=c;d*=3;d*=i;
-                       b*=c;b*=d;b*=d;b*=3;
-                       c*=d;c*=half;c*=a;c*=b;c*=3;
-                       a*=c;a*=b;a*=3;
-
-                       d*=a;d*=b;d*=c;d*=3;d*=i;
-                       b*=c;b*=d;b*=d;b*=3;
-                       c*=d;c*=half;c*=a;c*=b;c*=3;
-                       a*=c;a*=b;a*=3;
-
-                       d*=a;d*=b;d*=c;d*=3;d*=i;
-                       b*=c;b*=d;b*=d;b*=3;
-                       c*=d;c*=half;c*=a;c*=b;c*=3;
-                       a*=c;a*=b;a*=3;
-
+               for(i=1;i<MUL_TEST;i++)
+               {
+                       d*=a;d*=b;d*=c;d*=3;d*=i; b*=c;b*=d;b*=d;b*=3; c*=d;c*=one_and_a_half;c*=a;c*=b;c*=3; a*=c;a*=b;a*=3;
+                       d*=a;d*=b;d*=c;d*=3;d*=i; b*=c;b*=d;b*=d;b*=3; c*=d;c*=one_and_a_half;c*=a;c*=b;c*=3; a*=c;a*=b;a*=3;
+                       d*=a;d*=b;d*=c;d*=3;d*=i; b*=c;b*=d;b*=d;b*=3; c*=d;c*=one_and_a_half;c*=a;c*=b;c*=3; a*=c;a*=b;a*=3;
+                       d*=a;d*=b;d*=c;d*=3;d*=i; b*=c;b*=d;b*=d;b*=3; c*=d;c*=one_and_a_half;c*=a;c*=b;c*=3; a*=c;a*=b;a*=3;
+                       d*=a;d*=b;d*=c;d*=3;d*=i; b*=c;b*=d;b*=d;b*=3; c*=d;c*=one_and_a_half;c*=a;c*=b;c*=3; a*=c;a*=b;a*=3;
+                       d*=a;d*=b;d*=c;d*=3;d*=i; b*=c;b*=d;b*=d;b*=3; c*=d;c*=one_and_a_half;c*=a;c*=b;c*=3; a*=c;a*=b;a*=3;
+                       d*=a;d*=b;d*=c;d*=3;d*=i; b*=c;b*=d;b*=d;b*=3; c*=d;c*=one_and_a_half;c*=a;c*=b;c*=3; a*=c;a*=b;a*=3;
                }
+
+               fprintf(stderr, "[%1d]...", int(int(a)/1e9)+5); // so the compiler doesn't optimize everything out
                return MyTimer();
        }
-       
+
        double div_test(void)
        {
                value_type a(30);
                value_type b(40);
-               int i;
+               value_type acc(0);
+               int i, j;
                etl::clock MyTimer;
                MyTimer.reset();
-               for(i=1;i<DIV_TEST;i++)
-               {
-                       a=3+i;
-                       b=40+i;
-                       b/=a;
-                       a/=(i%20)+1;
-
-                       a=3+i;
-                       b=40+i;
-                       b/=a;
-                       a/=(i%20)+1;
-
-                       a=3+i;
-                       b=40+i;
-                       b/=a;
-                       a/=(i%20)+1;
-
-                       a=3+i;
-                       b=40+i;
-                       b/=a;
-                       a/=(i%20)+1;
-
-                       a=3+i;
-                       b=40+i;
-                       b/=a;
-                       a/=(i%20)+1;
-
-                       a=3+i;
-                       b=40+i;
-                       b/=a;
-                       a/=(i%20)+1;
-
-               }
-               
-               
+               for(j=0;j<10;j++)
+                       for(i=1;i<DIV_TEST;i++)
+                       {
+                               a=3+i; b=40+i; b/=a; a/=(i%20)+1; acc+= a;
+                               a=3+i; b=40+i; b/=a; a/=(i%20)+1; acc+= a;
+                               a=3+i; b=40+i; b/=a; a/=(i%20)+1; acc+= a;
+                               a=3+i; b=40+i; b/=a; a/=(i%20)+1; acc+= a;
+                               a=3+i; b=40+i; b/=a; a/=(i%20)+1; acc+= a;
+                               a=3+i; b=40+i; b/=a; a/=(i%20)+1; acc+= a;
+                       }
+
+               fprintf(stderr, "[%1d]...", int(int(acc)/1e9)+5); // so the compiler doesn't optimize everything out
                return MyTimer();
        }
 };
@@ -196,10 +122,10 @@ struct speed_test
 int basic_test(void)
 {
        int ret=0;
-       
+
        fixed a,b,c;
        double d;
-       
+
        a=-1;
        a=std::abs(a);
        if(a!=fixed(1))
@@ -207,10 +133,10 @@ int basic_test(void)
                fprintf(stderr,"fixed: abs() failure on line %d in "__FILE__".\n",__LINE__);
                ret++;
        }
-       
+
        d=(double)(fixed(2.5)*fixed(3.0f)/7)-(2.5f*3.0f/7.0f);
        fprintf(stderr,"fixed: 2.5 * 2 / 7 --- Difference: %f\n",d);
-       if(d<0.0)d=-d;  
+       if(d<0.0)d=-d;
        if( d>0.0005)
        {
                fprintf(stderr,"fixed: Failed test on line %d in "__FILE__".\n",__LINE__);
@@ -225,28 +151,32 @@ int basic_test(void)
        d-=(double)a;
        fprintf(stderr,"fixed: ( 1043 / 27 + 10.42 ) / 6 * PI --- Difference: %f\n",d);
        if(d<0.0)d=-d;
+#ifdef ROUND_TO_NEAREST_INTEGER
        if( d>0.0005)
+#else
+       if( d>0.0025)
+#endif
        {
                fprintf(stderr,"fixed: Failed test on line %d in "__FILE__".\n",__LINE__);
                ret++;
        }
-       
+
        return ret;
 }
 
 int char_test(void)
 {
        int ret=0;
-       
+
        fixed_base<unsigned char,8> fix;
        double flt;
-       
+
        if(sizeof(fix)!=sizeof(unsigned char))
        {
                ret++;
                fprintf(stderr,"fixed: Size of fixed_base<unsigned char,8> is wrong!\n");
        }
-       
+
        flt=1.0;
        fix=1.0;
        fprintf(stderr,"fixed: value=%f, data=%d, shouldbe=%f, error=%f\n",(float)fix,fix.data(),flt,(float)fix-flt);
@@ -258,15 +188,15 @@ int char_test(void)
        flt*=0.7;
        fix*=0.7;
        fprintf(stderr,"fixed: value=%f, data=%d, shouldbe=%f, error=%f\n",(float)fix,fix.data(),flt,(float)fix-flt);
-       
+
        flt*=0.7;
        fix*=0.7;
        fprintf(stderr,"fixed: value=%f, data=%d, shouldbe=%f, error=%f\n",(float)fix,fix.data(),flt,(float)fix-flt);
-       
+
        flt*=0.7;
        fix*=0.7;
        fprintf(stderr,"fixed: value=%f, data=%d, shouldbe=%f, error=%f\n",(float)fix,fix.data(),flt,(float)fix-flt);
-       
+
        flt*=0.7;
        fix*=0.7;
        fprintf(stderr,"fixed: value=%f, data=%d, shouldbe=%f, error=%f\n",(float)fix,fix.data(),flt,(float)fix-flt);
@@ -283,7 +213,7 @@ int char_test(void)
        fix*=2;
        fprintf(stderr,"fixed: value=%f, data=%d, shouldbe=%f, error=%f\n",(float)fix,fix.data(),flt,(float)fix-flt);
 
-       
+
        return ret;
 }
 
@@ -292,74 +222,73 @@ int char_test(void)
 int main()
 {
        int error=0;
-       
+
        error+=basic_test();
        error+=char_test();
-       
+
        speed_test<float> float_test;
        speed_test<int> int_test;
        speed_test<fixed> fixed_test;
-       
+
        {
                double flt,fix,inte;
-               fprintf(stderr,"Addition/subtraction test...");         
+               fprintf(stderr,"\nAddition/subtraction test...\n");
 
-               fprintf(stderr,"calculating float..."); 
+               fprintf(stderr,"  calculating float.....");
                flt=float_test.add_sub_test();
-               fprintf(stderr,"float time: %fsec\n",flt);
+               fprintf(stderr,"   float time: %f sec\n",flt);
 
-               fprintf(stderr,"calculating fixed..."); 
+               fprintf(stderr,"  calculating fixed.....");
                fix=fixed_test.add_sub_test();
-               fprintf(stderr,"fixed time: %fsec\n",fix);
+               fprintf(stderr,"   fixed time: %f sec\n",fix);
 
-               fprintf(stderr,"calculating integer...");       
+               fprintf(stderr,"  calculating integer...");
                inte=int_test.add_sub_test();
-               fprintf(stderr,"integer time: %fsec\n",inte);
+               fprintf(stderr," integer time: %f sec\n",inte);
 
                if(flt>fix)
                        fprintf(stderr,"Fixed point wins by %f seconds! (%f%% faster)\n",flt-fix,flt/fix*100.0f-100.0f);
                else
                        fprintf(stderr,"Floating point wins by %f seconds! (%f%% faster)\n",fix-flt,fix/flt*100.0f-100.0f);
-               
+
        }
-       
+
        {
                double flt,fix,inte;
-               fprintf(stderr,"Product test...");              
-               fprintf(stderr,"calculating float..."); 
+               fprintf(stderr,"\nProduct test...\n");
+               fprintf(stderr,"  calculating float.....");
                flt=float_test.mul_test();
-               fprintf(stderr,"float time: %fsec\n",flt);
-               fprintf(stderr,"calculating fixed..."); 
+               fprintf(stderr,"   float time: %f sec\n",flt);
+               fprintf(stderr,"  calculating fixed.....");
                fix=fixed_test.mul_test();
-               fprintf(stderr,"fixed time: %fsec\n",fix);
-               fprintf(stderr,"calculating integer...");       
+               fprintf(stderr,"   fixed time: %f sec\n",fix);
+               fprintf(stderr,"  calculating integer...");
                inte=int_test.mul_test();
-               fprintf(stderr,"integer time: %fsec\n",inte);
+               fprintf(stderr," integer time: %f sec\n",inte);
                if(flt>fix)
                        fprintf(stderr,"Fixed point wins by %f seconds! (%f%% faster)\n",flt-fix,flt/fix*100.0f-100.0f);
                else
                        fprintf(stderr,"Floating point wins by %f seconds! (%f%% faster)\n",fix-flt,fix/flt*100.0f-100.0f);
-               
        }
 
        {
                double flt,fix,inte;
-               fprintf(stderr,"Division test...");             
-               fprintf(stderr,"calculating float..."); 
+               fprintf(stderr,"\nDivision test...\n");
+               fprintf(stderr,"  calculating float.....");
                flt=float_test.div_test();
-               fprintf(stderr,"float time: %fsec\n",flt);
-               fprintf(stderr,"calculating fixed..."); 
+               fprintf(stderr,"   float time: %f sec\n",flt);
+               fprintf(stderr,"  calculating fixed.....");
                fix=fixed_test.div_test();
-               fprintf(stderr,"fixed time: %fsec\n",fix);
-               fprintf(stderr,"calculating integer...");       
+               fprintf(stderr,"   fixed time: %f sec\n",fix);
+               fprintf(stderr,"  calculating integer...");
                inte=int_test.div_test();
-               fprintf(stderr,"integer time: %fsec\n",inte);
+               fprintf(stderr," integer time: %f sec\n",inte);
                if(flt>fix)
                        fprintf(stderr,"Fixed point wins by %f seconds! (%f%% faster)\n",flt-fix,flt/fix*100.0f-100.0f);
                else
                        fprintf(stderr,"Floating point wins by %f seconds! (%f%% faster)\n",fix-flt,fix/flt*100.0f-100.0f);
-               
+               fprintf(stderr,"\n");
        }
-       
+
        return error;
 }