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

  1. #include <vd2/system/halffloat.h>
  2. #include "test.h"
  3.  
  4. #define TEST_FLOAT_TO_HALF(floatpat, halfpat)    \
  5.     f = (floatpat); h = VDConvertFloatToHalf((const float *)&f); TEST_ASSERT(h == (halfpat));    \
  6.     f = (floatpat) | 0x80000000; h = VDConvertFloatToHalf((const float *)&f); TEST_ASSERT(h == ((halfpat) | 0x8000))
  7.  
  8. #define TEST_HALF_TO_FLOAT(halfpat, floatpat)    \
  9.     VDConvertHalfToFloat((halfpat), (float *)&f); TEST_ASSERT(f == (floatpat));    \
  10.     VDConvertHalfToFloat((halfpat) | 0x8000, (float *)&f); TEST_ASSERT(f == ((floatpat) | 0x80000000))
  11.  
  12. DEFINE_TEST(HalfFloat) {
  13.     uint32 f;
  14.     uint16 h;
  15.  
  16.     ///////////////////////////////////////////////////////////////////////
  17.     // float to half conversions
  18.     //
  19.  
  20.     // 0.0
  21.     TEST_FLOAT_TO_HALF(0x00000000, 0x0000);
  22.  
  23.     // smallest denormalized half
  24.     TEST_FLOAT_TO_HALF(0x33800000, 0x0001);
  25.  
  26.     // largest denormalized half
  27.     TEST_FLOAT_TO_HALF(0x387fa000, 0x03fe);
  28.     TEST_FLOAT_TO_HALF(0x387fa001, 0x03ff);
  29.     TEST_FLOAT_TO_HALF(0x387fc000, 0x03ff);
  30.     TEST_FLOAT_TO_HALF(0x387fdfff, 0x03ff);
  31.     TEST_FLOAT_TO_HALF(0x387fe000, 0x0400);
  32.  
  33.     // smallest normalized half
  34.     TEST_FLOAT_TO_HALF(0x38800000, 0x0400);
  35.  
  36.     // 0.5
  37.     TEST_FLOAT_TO_HALF(0x3f000000, 0x3800);
  38.  
  39.     // 1.0
  40.     TEST_FLOAT_TO_HALF(0x3f800000, 0x3c00);        // exact, 1.0
  41.     TEST_FLOAT_TO_HALF(0x3f800fff, 0x3c00);        // round down
  42.     TEST_FLOAT_TO_HALF(0x3f801000, 0x3c00);        // round down to nearest even
  43.     TEST_FLOAT_TO_HALF(0x3f801001, 0x3c01);        // round up
  44.     TEST_FLOAT_TO_HALF(0x3f802000, 0x3c01);        // exact
  45.     TEST_FLOAT_TO_HALF(0x3f802fff, 0x3c01);        // round down
  46.     TEST_FLOAT_TO_HALF(0x3f803000, 0x3c02);        // round up to nearest even
  47.     TEST_FLOAT_TO_HALF(0x3f803001, 0x3c02);        // round up
  48.     TEST_FLOAT_TO_HALF(0x3f804000, 0x3c02);        // exact
  49.  
  50.     // 2.0
  51.     TEST_FLOAT_TO_HALF(0x40000000, 0x4000);
  52.  
  53.     // pi
  54.     TEST_FLOAT_TO_HALF(0x40490fdb, 0x4248);
  55.  
  56.     // infinity
  57.     TEST_FLOAT_TO_HALF(0x7f800000, 0x7c00);
  58.  
  59.     ///////////////////////////////////////////////////////////////////////
  60.     // half to float conversions
  61.     //
  62.  
  63.     // 0.0
  64.     TEST_HALF_TO_FLOAT(0x0000, 0x00000000);
  65.  
  66.     // smallest denormalized half
  67.     TEST_HALF_TO_FLOAT(0x0001, 0x33800000);
  68.  
  69.     // largest denormalized half
  70.     TEST_HALF_TO_FLOAT(0x03ff, 0x387fc000);
  71.  
  72.     // smallest normalized half
  73.     TEST_HALF_TO_FLOAT(0x0400, 0x38800000);
  74.  
  75.     // 0.5
  76.     TEST_HALF_TO_FLOAT(0x3800, 0x3f000000);
  77.  
  78.     // 1.0
  79.     TEST_HALF_TO_FLOAT(0x3c00, 0x3f800000);
  80.  
  81.     // 2.0
  82.     TEST_HALF_TO_FLOAT(0x4000, 0x40000000);
  83.  
  84.     // pi
  85.     TEST_HALF_TO_FLOAT(0x4248, 0x40490000);
  86.  
  87.     // largest normalized half (65504)
  88.     TEST_HALF_TO_FLOAT(0x7bff, 0x477fe000);
  89.  
  90.     // infinity
  91.     TEST_HALF_TO_FLOAT(0x7c00, 0x7f800000);
  92.  
  93.     return 0;
  94. }
  95.