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 / TestMath.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2009-09-14  |  4.0 KB  |  105 lines

  1. #include <vd2/system/math.h>
  2. #include <vd2/system/int128.h>
  3. #include <vd2/system/fraction.h>
  4. #include "test.h"
  5.  
  6. namespace {
  7.     vduint128 rand128_64(vduint128 v) {
  8.         return vduint128(v.getLo(), ~(v.getHi() ^ (uint64)(v >> (126 - 64)) ^ (uint64)(v >> (101 - 64)) ^ (uint64)(v >> (99 - 64))));
  9.     }
  10.  
  11.     vduint128 rand128(vduint128 v) {
  12.         return rand128_64(rand128_64(v));
  13.     }
  14.  
  15.     vduint128 slowmul(vduint128 x, vduint128 y) {
  16.         vdint128 shifter;
  17.         shifter.q[0] = x.getLo();
  18.         shifter.q[1] = x.getHi();
  19.         vduint128 result(0);
  20.         vdint128 zero(0);
  21.  
  22.         for(int i=0; i<128; ++i) {
  23.             result += result;
  24.             if (shifter < zero)
  25.                 result += y;
  26.             shifter += shifter;
  27.         }
  28.  
  29.         return result;
  30.     }
  31. }
  32.  
  33. DEFINE_TEST(Math) {
  34.     TEST_ASSERT(VDRoundToInt(-2.00f) ==-2);
  35.     TEST_ASSERT(VDRoundToInt(-1.51f) ==-2);
  36.     TEST_ASSERT(VDRoundToInt(-1.49f) ==-1);
  37.     TEST_ASSERT(VDRoundToInt(-1.00f) ==-1);
  38.     TEST_ASSERT(VDRoundToInt(-0.51f) ==-1);
  39.     TEST_ASSERT(VDRoundToInt(-0.49f) == 0);
  40.     TEST_ASSERT(VDRoundToInt( 0.00f) == 0);
  41.     TEST_ASSERT(VDRoundToInt( 0.49f) == 0);
  42.     TEST_ASSERT(VDRoundToInt( 0.51f) == 1);
  43.     TEST_ASSERT(VDRoundToInt( 1.00f) == 1);
  44.     TEST_ASSERT(VDRoundToInt( 1.49f) == 1);
  45.     TEST_ASSERT(VDRoundToInt( 1.51f) == 2);
  46.     TEST_ASSERT(VDRoundToInt( 2.00f) == 2);
  47.  
  48.     TEST_ASSERT(VDFloorToInt(-2.0f) == -2);
  49.     TEST_ASSERT(VDFloorToInt(-1.5f) == -2);
  50.     TEST_ASSERT(VDFloorToInt(-1.0f) == -1);
  51.     TEST_ASSERT(VDFloorToInt(-0.5f) == -1);
  52.     TEST_ASSERT(VDFloorToInt( 0.0f) ==  0);
  53.     TEST_ASSERT(VDFloorToInt( 0.5f) ==  0);
  54.     TEST_ASSERT(VDFloorToInt( 1.0f) ==  1);
  55.     TEST_ASSERT(VDFloorToInt( 1.5f) ==  1);
  56.     TEST_ASSERT(VDFloorToInt( 2.0f) ==  2);
  57.  
  58.     TEST_ASSERT(VDCeilToInt(-2.0f) == -2);
  59.     TEST_ASSERT(VDCeilToInt(-1.5f) == -1);
  60.     TEST_ASSERT(VDCeilToInt(-1.0f) == -1);
  61.     TEST_ASSERT(VDCeilToInt(-0.5f) ==  0);
  62.     TEST_ASSERT(VDCeilToInt( 0.0f) ==  0);
  63.     TEST_ASSERT(VDCeilToInt( 0.5f) ==  1);
  64.     TEST_ASSERT(VDCeilToInt( 1.0f) ==  1);
  65.     TEST_ASSERT(VDCeilToInt( 1.5f) ==  2);
  66.     TEST_ASSERT(VDCeilToInt( 2.0f) ==  2);
  67.  
  68.     TEST_ASSERT(VDUMul64x64To128(1, 1) == vduint128(1));
  69.     TEST_ASSERT(VDUMul64x64To128(3, 7) == vduint128(21));
  70.     TEST_ASSERT(VDUMul64x64To128(0xFFFFFFFF, 0xFFFFFFFF) == vduint128(0xFFFFFFFE00000001));
  71.     TEST_ASSERT(VDUMul64x64To128(0x123456789ABCDEF0, 0xBAADF00DDEADBEEF) == vduint128(0x0D4665441D7CFEBC, 0xD182EA976BFA4210));
  72.     TEST_ASSERT(VDUMul64x64To128(0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF) == vduint128(0xFFFFFFFFFFFFFFFE, 0x0000000000000001));
  73.  
  74.     uint64 quotient;
  75.     uint64 remainder;
  76.     TEST_ASSERT(((quotient = VDUDiv128x64To64(vduint128(21), 7, remainder)), quotient == 3 && remainder == 0));
  77.     TEST_ASSERT(((quotient = VDUDiv128x64To64(vduint128(27), 7, remainder)), quotient == 3 && remainder == 6));
  78.     TEST_ASSERT(((quotient = VDUDiv128x64To64(vduint128(0xFFFFFFFFFFFFFFFE, 0x0000000000000001), 0xFFFFFFFFFFFFFFFF, remainder)), quotient == 0xFFFFFFFFFFFFFFFF && remainder == 0));
  79.     TEST_ASSERT(((quotient = VDUDiv128x64To64(vduint128(0xFFFFFFFFFFFFFFFF, 0x0000000000000000), 0xFFFFFFFFFFFFFFFF, remainder)), quotient == 0xFFFFFFFFFFFFFFFF && remainder == 0xFFFFFFFFFFFFFFFF));
  80.     TEST_ASSERT(((quotient = VDUDiv128x64To64(vduint128(0x123456789ABCDEF0, 0xBAADF00DDEADBEEF), 0xFEDCBA9876543210, remainder)), quotient == 0x1249249249249238 && remainder == 0xA72CB7FA5D75AB6F));
  81.  
  82.     TEST_ASSERT(VDFraction(3,2) * VDFraction(2,3) == VDFraction(1,1));
  83.     TEST_ASSERT(VDFraction(3,2) * VDFraction(5,8) == VDFraction(15,16));
  84.     TEST_ASSERT(VDFraction(15,16) / VDFraction(5,8) == VDFraction(3,2));
  85.     TEST_ASSERT(VDFraction(1024,768) == VDFraction(4,3));
  86.     TEST_ASSERT(VDFraction(0xFFFFFFFC/3,0xFFFFFFFF) * VDFraction(0xFFFFFFFF,0xFFFFFFFC) == VDFraction(1,3));
  87.  
  88.     TEST_ASSERT(VDMulDiv64(-10000000000000000, -10000000000000000, -10000000000000000) == -10000000000000000);
  89.     TEST_ASSERT(VDMulDiv64(-1000000000000, -100000, 17) == 5882352941176471);
  90.  
  91.     vduint128 seed(0);
  92.  
  93.     for(int i=0; i<10000; ++i) {
  94.         vduint128 x(seed);    seed = rand128(seed);
  95.         vduint128 y(seed);    seed = rand128(seed);
  96.         vduint128 p(x*y);
  97.         vduint128 q(slowmul(x, y));
  98.  
  99.         TEST_ASSERT(p == q);
  100.     }
  101.  
  102.     return 0;
  103. }
  104.  
  105.