home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 275 / DPCS0111DVD.ISO / Toolkit / Audio-Visual / VirtualDub / Source / VirtualDub-1.9.10-src.7z / src / test / source / TestFraction.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2009-09-14  |  6.5 KB  |  124 lines

  1. #include <math.h>
  2. #include <vd2/system/Fraction.h>
  3. #include "test.h"
  4.  
  5. DEFINE_TEST(Fraction) {
  6.     TEST_ASSERT(VDFraction(1,1) * VDFraction(2,3) == VDFraction(2,3));
  7.     TEST_ASSERT(VDFraction(3,1) * VDFraction(2,3) == VDFraction(2,1));
  8.     TEST_ASSERT(VDFraction(0x80000000, 0x80000000) == VDFraction(1,1));
  9.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000) == VDFraction(30,1));
  10.  
  11.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64r ( 10000000000000i64) ==  333333333333i64);
  12.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64t ( 10000000000000i64) ==  333333333333i64);
  13.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64u ( 10000000000000i64) ==  333333333334i64);
  14.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64ir( 10000000000000i64) ==  333333333333i64);
  15.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64it( 10000000000000i64) ==  333333333333i64);
  16.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64iu( 10000000000000i64) ==  333333333334i64);
  17.  
  18.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64r ( 20000000000000i64) ==  666666666667i64);
  19.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64t ( 20000000000000i64) ==  666666666666i64);
  20.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64u ( 20000000000000i64) ==  666666666667i64);
  21.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64ir( 20000000000000i64) ==  666666666667i64);
  22.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64it( 20000000000000i64) ==  666666666666i64);
  23.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64iu( 20000000000000i64) ==  666666666667i64);
  24.  
  25.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64r ( 30000000000000i64) == 1000000000000i64);
  26.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64t ( 30000000000000i64) == 1000000000000i64);
  27.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64u ( 30000000000000i64) == 1000000000000i64);
  28.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64ir( 30000000000000i64) == 1000000000000i64);
  29.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64it( 30000000000000i64) == 1000000000000i64);
  30.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64iu( 30000000000000i64) == 1000000000000i64);
  31.  
  32.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64r (-10000000000000i64) == -333333333333i64);
  33.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64t (-10000000000000i64) == -333333333333i64);
  34.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64u (-10000000000000i64) == -333333333333i64);
  35.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64ir(-10000000000000i64) == -333333333333i64);
  36.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64it(-10000000000000i64) == -333333333333i64);
  37.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64iu(-10000000000000i64) == -333333333333i64);
  38.  
  39.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64r (-20000000000000i64) == -666666666667i64);
  40.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64t (-20000000000000i64) == -666666666666i64);
  41.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64u (-20000000000000i64) == -666666666666i64);
  42.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64ir(-20000000000000i64) == -666666666667i64);
  43.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64it(-20000000000000i64) == -666666666666i64);
  44.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64iu(-20000000000000i64) == -666666666666i64);
  45.  
  46.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64r (-30000000000000i64) ==-1000000000000i64);
  47.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64t (-30000000000000i64) ==-1000000000000i64);
  48.     TEST_ASSERT(VDFraction(0x08000000, 0xF0000000).scale64u (-30000000000000i64) ==-1000000000000i64);
  49.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64ir(-30000000000000i64) ==-1000000000000i64);
  50.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64it(-30000000000000i64) ==-1000000000000i64);
  51.     TEST_ASSERT(VDFraction(0xF0000000, 0x08000000).scale64iu(-30000000000000i64) ==-1000000000000i64);
  52.  
  53.     TEST_ASSERT(VDFraction(1, 1).scale64r (1) == 1);
  54.     TEST_ASSERT(VDFraction(1, 1).scale64t (1) == 1);
  55.     TEST_ASSERT(VDFraction(1, 1).scale64u (1) == 1);
  56.     TEST_ASSERT(VDFraction(1, 1).scale64ir(1) == 1);
  57.     TEST_ASSERT(VDFraction(1, 1).scale64it(1) == 1);
  58.     TEST_ASSERT(VDFraction(1, 1).scale64iu(1) == 1);
  59.     TEST_ASSERT(VDFraction(1, 1).scale64r (-1) == -1);
  60.     TEST_ASSERT(VDFraction(1, 1).scale64t (-1) == -1);
  61.     TEST_ASSERT(VDFraction(1, 1).scale64u (-1) == -1);
  62.     TEST_ASSERT(VDFraction(1, 1).scale64ir(-1) == -1);
  63.     TEST_ASSERT(VDFraction(1, 1).scale64it(-1) == -1);
  64.     TEST_ASSERT(VDFraction(1, 1).scale64iu(-1) == -1);
  65.  
  66.     // check for broken carry
  67.     TEST_ASSERT(VDFraction(0xFFFFFFFF, 0xFFFFFFFF).scale64r(0x7FFFFFFFFFFFFFFFi64) == 0x7FFFFFFFFFFFFFFFi64);
  68.  
  69.     // check fraction conversion
  70.     VDFraction frac;
  71.     TEST_ASSERT(frac.Parse("0") && frac == VDFraction(0, 1));
  72.     TEST_ASSERT(frac.Parse("1") && frac == VDFraction(1, 1));
  73.     TEST_ASSERT(frac.Parse(" 1") && frac == VDFraction(1, 1));
  74.     TEST_ASSERT(frac.Parse(" 1 ") && frac == VDFraction(1, 1));
  75.     TEST_ASSERT(frac.Parse("4294967295") && frac == VDFraction(0xFFFFFFFFUL, 1));
  76.     TEST_ASSERT(!frac.Parse("4294967296"));
  77.     TEST_ASSERT(!frac.Parse(" 1x"));
  78.     TEST_ASSERT(!frac.Parse("x1"));
  79.  
  80.     // check continued fraction approximations
  81.     frac = VDFraction(30000, 1001);
  82.     TEST_ASSERT(frac * frac * frac == VDFraction(2596703098, 96463));
  83.  
  84.     TEST_ASSERT(frac.Parse("3.14159265358979324") && frac == VDFraction(4030016662, 1282794145));
  85.  
  86.     // check overflow and underflow behavior
  87.     frac = VDFraction(0x80000000, 1);
  88.     TEST_ASSERT(frac * frac * frac * frac == VDFraction(0xFFFFFFFFUL, 1));
  89.  
  90.     frac = VDFraction(1, 0x80000000);
  91.     TEST_ASSERT(frac * frac * frac * frac == VDFraction(0, 1));
  92.  
  93.     frac = VDFraction(16, 15);
  94.     TEST_ASSERT(frac * frac * frac * frac * frac * frac * frac * frac == VDFraction(2569952127, 1533540481));
  95.  
  96.     // check conversion from double
  97.     TEST_ASSERT(0.0 == VDFraction(0.0).asDouble());
  98.     TEST_ASSERT(1.0 / 4294967295.0 == VDFraction(1.0 / 4294967295.0).asDouble());
  99.     TEST_ASSERT(4294967295.0 == VDFraction(4294967295.0).asDouble());
  100.     for(int i=-31; i<=31; ++i) {
  101.         double x = ldexp(1.0, i);
  102.         VDFraction frac = VDFraction(x);
  103.         double y = frac.asDouble();
  104.         TEST_ASSERT(x == y);
  105.     }
  106.  
  107.     double epsilon = ldexp(1.0, -51);
  108.     for(int i=0; i<100000; ++i) {
  109.         unsigned n = rand() ^ (rand() << 10) ^ (rand() << 20);
  110.         unsigned d = rand() ^ (rand() << 10) ^ (rand() << 20);
  111.  
  112.         if (!d)
  113.             continue;
  114.  
  115.         double x = (double)n / (double)d;
  116.         VDFraction frac = VDFraction(x);
  117.         double y = frac.asDouble();
  118.         TEST_ASSERT(fabs(x - y) < x * epsilon);
  119.     }
  120.  
  121.     return 0;
  122. }
  123.  
  124.