Disabled external gits
This commit is contained in:
		
							
								
								
									
										16
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/.cvsignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
Makefile
 | 
			
		||||
Makefile.in
 | 
			
		||||
config.h.in
 | 
			
		||||
config.h
 | 
			
		||||
config.log
 | 
			
		||||
config.status
 | 
			
		||||
configure
 | 
			
		||||
libtool
 | 
			
		||||
stamp-h
 | 
			
		||||
aclocal.m4
 | 
			
		||||
OpenEXR.pc
 | 
			
		||||
autom4te.cache
 | 
			
		||||
ltmain.sh
 | 
			
		||||
stamp-h.in
 | 
			
		||||
depcomp
 | 
			
		||||
.deps
 | 
			
		||||
							
								
								
									
										16
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
# yue.nicholas@gmail.com
 | 
			
		||||
 | 
			
		||||
ADD_EXECUTABLE ( HalfTest
 | 
			
		||||
  main.cpp
 | 
			
		||||
  testArithmetic.cpp
 | 
			
		||||
  testBitPatterns.cpp
 | 
			
		||||
  testClassification.cpp
 | 
			
		||||
  testError.cpp
 | 
			
		||||
  testFunction.cpp
 | 
			
		||||
  testLimits.cpp
 | 
			
		||||
  testSize.cpp
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
TARGET_LINK_LIBRARIES ( HalfTest Half )
 | 
			
		||||
 | 
			
		||||
ADD_TEST ( TestHalf  HalfTest )
 | 
			
		||||
							
								
								
									
										19
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
## Process this file with automake to produce Makefile.in
 | 
			
		||||
 | 
			
		||||
check_PROGRAMS = HalfTest
 | 
			
		||||
 | 
			
		||||
HalfTest_SOURCES = main.cpp testArithmetic.cpp testArithmetic.h \
 | 
			
		||||
		   testBitPatterns.cpp testBitPatterns.h \
 | 
			
		||||
		   testClassification.cpp testClassification.h \
 | 
			
		||||
		   testError.cpp testError.h testFunction.cpp \
 | 
			
		||||
		   testFunction.h testLimits.cpp testLimits.h testSize.cpp \
 | 
			
		||||
		   testSize.h
 | 
			
		||||
 | 
			
		||||
INCLUDES = -I$(top_builddir) -I$(top_srcdir)/Half -I$(top_srcdir)/config
 | 
			
		||||
 | 
			
		||||
LDADD = -L$(top_builddir)/Half -lHalf
 | 
			
		||||
 | 
			
		||||
TESTS = HalfTest
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = CMakeLists.txt
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										32
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/main.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
#include <testSize.h>
 | 
			
		||||
#include <testArithmetic.h>
 | 
			
		||||
#include <testError.h>
 | 
			
		||||
#include <testBitPatterns.h>
 | 
			
		||||
#include <testClassification.h>
 | 
			
		||||
#include <testLimits.h>
 | 
			
		||||
#include <testFunction.h>
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define TEST(x) if (argc < 2 || !strcmp (argv[1], #x)) x();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main (int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
    std::cout << "\ntesting type half:\n\n" << std::flush;
 | 
			
		||||
 | 
			
		||||
    TEST (testSize);
 | 
			
		||||
    TEST (testArithmetic);
 | 
			
		||||
    TEST (testNormalizedConversionError);
 | 
			
		||||
    TEST (testDenormalizedConversionError);
 | 
			
		||||
    TEST (testRoundingError);
 | 
			
		||||
    TEST (testBitPatterns);
 | 
			
		||||
    TEST (testClassification);
 | 
			
		||||
    TEST (testLimits);
 | 
			
		||||
    TEST (testFunction);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testArithmetic.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testArithmetic.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
#include <testArithmetic.h>
 | 
			
		||||
#include "half.h"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
testArithmetic ()
 | 
			
		||||
{
 | 
			
		||||
    cout << "basic arithmetic operations:\n";
 | 
			
		||||
 | 
			
		||||
    float f1 (1);
 | 
			
		||||
    float f2 (2);
 | 
			
		||||
    half  h1 (3);
 | 
			
		||||
    half  h2 (4);
 | 
			
		||||
 | 
			
		||||
    cout << "f1 = " << f1 << ", "
 | 
			
		||||
	    "f2 = " << f2 << ", "
 | 
			
		||||
	    "h1 = " << h1 << ", "
 | 
			
		||||
	    "h2 = " << h2 << endl;
 | 
			
		||||
 | 
			
		||||
    h1 = f1 + f2;
 | 
			
		||||
    assert (h1 == 3);
 | 
			
		||||
 | 
			
		||||
    cout << "h1 = f1 + f2: " << h1 << endl;
 | 
			
		||||
 | 
			
		||||
    h2 += f1;
 | 
			
		||||
    assert (h2 == 5);
 | 
			
		||||
 | 
			
		||||
    cout << "h2 += f1: " << h2 << endl;
 | 
			
		||||
 | 
			
		||||
    h2 = h1 + h2;
 | 
			
		||||
    assert (h2 == 8);
 | 
			
		||||
 | 
			
		||||
    cout << "h2 = h1 + h2: " << h2 << endl;
 | 
			
		||||
 | 
			
		||||
    h2 += h1;
 | 
			
		||||
    assert (h2 == 11);
 | 
			
		||||
 | 
			
		||||
    cout << "h2 += h1: " << h2 << endl;
 | 
			
		||||
 | 
			
		||||
    h1 = h2;
 | 
			
		||||
    assert (h1 == 11);
 | 
			
		||||
 | 
			
		||||
    cout << "h1 = h2: " << h1 << endl;
 | 
			
		||||
 | 
			
		||||
    h2 = -h1;
 | 
			
		||||
    assert (h2 == -11);
 | 
			
		||||
 | 
			
		||||
    cout << "h2 = -h1: " << h2 << endl;
 | 
			
		||||
 | 
			
		||||
    cout << "ok\n\n" << flush;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testArithmetic.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testArithmetic.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
 | 
			
		||||
void testArithmetic ();
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										484
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testBitPatterns.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										484
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testBitPatterns.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,484 @@
 | 
			
		||||
#include <testBitPatterns.h>
 | 
			
		||||
#include "half.h"
 | 
			
		||||
#include <float.h>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
equalBitPatterns (const char *b1, const char *b2)
 | 
			
		||||
{
 | 
			
		||||
    //
 | 
			
		||||
    // Returns true if the characters in zero-terminated string b1
 | 
			
		||||
    // are the same as the charaters in string b2, except for places
 | 
			
		||||
    // where b1 or b2 contains an 'X'.  For example:
 | 
			
		||||
    //
 | 
			
		||||
    //	equalBitPatterns ("100", "100") returns true
 | 
			
		||||
    //	equalBitPatterns ("100", "101") returns false
 | 
			
		||||
    //	equalBitPatterns ("10X", "101") returns true
 | 
			
		||||
    //	equalBitPatterns ("10X", "100") returns true
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    while (*b1 && *b2)
 | 
			
		||||
    {
 | 
			
		||||
	if (*b1 != *b2 && *b1 != 'X' && *b2 != 'X')
 | 
			
		||||
	    return false;
 | 
			
		||||
 | 
			
		||||
	++b1;
 | 
			
		||||
	++b2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return !(*b1 || *b2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
testBits (float f, const char bh[19], const char bg[35])
 | 
			
		||||
{
 | 
			
		||||
    half  h (f);
 | 
			
		||||
    float g (h);
 | 
			
		||||
 | 
			
		||||
    cout.width (15);
 | 
			
		||||
    cout.precision (8);
 | 
			
		||||
    cout << f << "    ";
 | 
			
		||||
    printBits (cout, f);
 | 
			
		||||
    cout << "    ";
 | 
			
		||||
    printBits (cout, h);
 | 
			
		||||
    cout << '\n';
 | 
			
		||||
    cout.width (15);
 | 
			
		||||
    cout << g << "    ";
 | 
			
		||||
    printBits (cout, g);
 | 
			
		||||
    cout << "\n\n";
 | 
			
		||||
 | 
			
		||||
    if (bh || bg)
 | 
			
		||||
    {
 | 
			
		||||
	char ch[19], cg[35];
 | 
			
		||||
 | 
			
		||||
	printBits (ch, h);
 | 
			
		||||
	printBits (cg, g);
 | 
			
		||||
 | 
			
		||||
	if (!equalBitPatterns (ch, bh))
 | 
			
		||||
	{
 | 
			
		||||
	    cout << "error: expected " << bh << ", got " << ch << endl;
 | 
			
		||||
	    assert (false);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!equalBitPatterns (cg, bg))
 | 
			
		||||
	{
 | 
			
		||||
	    cout << "error: expected " << bg << ", got " << cg << endl;
 | 
			
		||||
	    assert (false);
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
floatPosInfinity ()
 | 
			
		||||
{
 | 
			
		||||
    half::uif x;
 | 
			
		||||
    x.i = 0x7f800000;
 | 
			
		||||
    return x.f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
floatNegInfinity ()
 | 
			
		||||
{
 | 
			
		||||
    half::uif x;
 | 
			
		||||
    x.i = 0xff800000;
 | 
			
		||||
    return x.f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
floatPosQNan1 ()
 | 
			
		||||
{
 | 
			
		||||
    half::uif x;
 | 
			
		||||
    x.i = 0x7fffffff;
 | 
			
		||||
    return x.f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
floatNegQNan1 ()
 | 
			
		||||
{
 | 
			
		||||
    half::uif x;
 | 
			
		||||
    x.i = 0xffffffff;
 | 
			
		||||
    return x.f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
floatPosQNan2 ()
 | 
			
		||||
{
 | 
			
		||||
    half::uif x;
 | 
			
		||||
    x.i = 0x7fd55555;
 | 
			
		||||
    return x.f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
floatNegQNan2 ()
 | 
			
		||||
{
 | 
			
		||||
    half::uif x;
 | 
			
		||||
    x.i = 0xffd55555;
 | 
			
		||||
    return x.f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
testBitPatterns()
 | 
			
		||||
{
 | 
			
		||||
    cout << "specific bit patterns\n\n";
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Numbers close to 1.0
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    testBits (1.0f,
 | 
			
		||||
	      "0 01111 0000000000",
 | 
			
		||||
	      "0 01111111 00000000000000000000000");
 | 
			
		||||
    testBits (1.0f + HALF_EPSILON,
 | 
			
		||||
	      "0 01111 0000000001",
 | 
			
		||||
	      "0 01111111 00000000010000000000000");
 | 
			
		||||
    testBits (1.0f + HALF_EPSILON * 0.5f,
 | 
			
		||||
	      "0 01111 0000000000",
 | 
			
		||||
	      "0 01111111 00000000000000000000000");
 | 
			
		||||
    testBits (1.0f+ HALF_EPSILON * 0.4999f,
 | 
			
		||||
	      "0 01111 0000000000",
 | 
			
		||||
	      "0 01111111 00000000000000000000000");
 | 
			
		||||
    testBits (1.0f + HALF_EPSILON * 0.5001f,
 | 
			
		||||
	      "0 01111 0000000001",
 | 
			
		||||
	      "0 01111111 00000000010000000000000");
 | 
			
		||||
    testBits (1.0f + HALF_EPSILON + HALF_EPSILON,
 | 
			
		||||
	      "0 01111 0000000010",
 | 
			
		||||
	      "0 01111111 00000000100000000000000");
 | 
			
		||||
    testBits (1.0f + HALF_EPSILON + HALF_EPSILON * 0.5f,
 | 
			
		||||
	      "0 01111 0000000010",
 | 
			
		||||
	      "0 01111111 00000000100000000000000");
 | 
			
		||||
    testBits (1.0f + HALF_EPSILON + HALF_EPSILON * 0.4999f,
 | 
			
		||||
	      "0 01111 0000000001",
 | 
			
		||||
	      "0 01111111 00000000010000000000000");
 | 
			
		||||
    testBits (1.0f + HALF_EPSILON + HALF_EPSILON * 0.5001f,
 | 
			
		||||
	      "0 01111 0000000010",
 | 
			
		||||
	      "0 01111111 00000000100000000000000");
 | 
			
		||||
    testBits (1.0f - HALF_EPSILON * 0.5f,
 | 
			
		||||
	      "0 01110 1111111111",
 | 
			
		||||
	      "0 01111110 11111111110000000000000");
 | 
			
		||||
    testBits (1.0f - HALF_EPSILON * 0.5f * 0.5f,
 | 
			
		||||
	      "0 01111 0000000000",
 | 
			
		||||
	      "0 01111111 00000000000000000000000");
 | 
			
		||||
    testBits (1.0f - HALF_EPSILON * 0.5f * 0.4999f,
 | 
			
		||||
	      "0 01111 0000000000",
 | 
			
		||||
	      "0 01111111 00000000000000000000000");
 | 
			
		||||
    testBits (1.0f - HALF_EPSILON * 0.5f * 0.5001f,
 | 
			
		||||
	      "0 01110 1111111111",
 | 
			
		||||
	      "0 01111110 11111111110000000000000");
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Numbers close to HALF_MIN
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    testBits (HALF_MIN,
 | 
			
		||||
	      "0 00000 0000000001",
 | 
			
		||||
	      "0 01100111 00000000000000000000000");
 | 
			
		||||
    testBits (HALF_MIN + HALF_MIN,
 | 
			
		||||
	      "0 00000 0000000010",
 | 
			
		||||
	      "0 01101000 00000000000000000000000");
 | 
			
		||||
    testBits (HALF_MIN + HALF_MIN * 0.5f,
 | 
			
		||||
	      "0 00000 0000000010",
 | 
			
		||||
	      "0 01101000 00000000000000000000000");
 | 
			
		||||
    testBits (HALF_MIN + HALF_MIN * 0.4999f,
 | 
			
		||||
	      "0 00000 0000000001",
 | 
			
		||||
	      "0 01100111 00000000000000000000000");
 | 
			
		||||
    testBits (HALF_MIN + HALF_MIN * 0.5001f,
 | 
			
		||||
	      "0 00000 0000000010",
 | 
			
		||||
	      "0 01101000 00000000000000000000000");
 | 
			
		||||
    testBits (HALF_MIN - HALF_MIN,
 | 
			
		||||
	      "0 00000 0000000000",
 | 
			
		||||
	      "0 00000000 00000000000000000000000");
 | 
			
		||||
    testBits (HALF_MIN - HALF_MIN * 0.5f,
 | 
			
		||||
	      "0 00000 0000000000",
 | 
			
		||||
	      "0 00000000 00000000000000000000000");
 | 
			
		||||
    testBits (HALF_MIN - HALF_MIN * 0.4999f,
 | 
			
		||||
	      "0 00000 0000000001",
 | 
			
		||||
	      "0 01100111 00000000000000000000000");
 | 
			
		||||
    testBits (HALF_MIN - HALF_MIN * 0.5001f,
 | 
			
		||||
	      "0 00000 0000000000",
 | 
			
		||||
	      "0 00000000 00000000000000000000000");
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Numbers close to HALF_NRM_MIN
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    testBits (HALF_NRM_MIN,
 | 
			
		||||
	      "0 00001 0000000000",
 | 
			
		||||
	      "0 01110001 00000000000000000000000");
 | 
			
		||||
    testBits (HALF_NRM_MIN + HALF_MIN,
 | 
			
		||||
	      "0 00001 0000000001",
 | 
			
		||||
	      "0 01110001 00000000010000000000000");
 | 
			
		||||
    testBits (HALF_NRM_MIN + HALF_MIN * 0.5f,
 | 
			
		||||
	      "0 00001 0000000000",
 | 
			
		||||
	      "0 01110001 00000000000000000000000");
 | 
			
		||||
    testBits (HALF_NRM_MIN + HALF_MIN * 0.4999f,
 | 
			
		||||
	      "0 00001 0000000000",
 | 
			
		||||
	      "0 01110001 00000000000000000000000");
 | 
			
		||||
    testBits (HALF_NRM_MIN + HALF_MIN * 0.5001f,
 | 
			
		||||
	      "0 00001 0000000001",
 | 
			
		||||
	      "0 01110001 00000000010000000000000");
 | 
			
		||||
    testBits (HALF_NRM_MIN - HALF_MIN,
 | 
			
		||||
	      "0 00000 1111111111",
 | 
			
		||||
	      "0 01110000 11111111100000000000000");
 | 
			
		||||
    testBits (HALF_NRM_MIN - HALF_MIN * 0.5f,
 | 
			
		||||
	      "0 00001 0000000000",
 | 
			
		||||
	      "0 01110001 00000000000000000000000");
 | 
			
		||||
    testBits (HALF_NRM_MIN - HALF_MIN * 0.49995f,
 | 
			
		||||
	      "0 00001 0000000000",
 | 
			
		||||
	      "0 01110001 00000000000000000000000");
 | 
			
		||||
    testBits (HALF_NRM_MIN - HALF_MIN * 0.50005f,
 | 
			
		||||
	      "0 00000 1111111111",
 | 
			
		||||
	      "0 01110000 11111111100000000000000");
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Small positive integers and simple decimal fractions
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    testBits (2,
 | 
			
		||||
	      "0 10000 0000000000",
 | 
			
		||||
	      "0 10000000 00000000000000000000000");
 | 
			
		||||
    testBits (3,
 | 
			
		||||
	      "0 10000 1000000000",
 | 
			
		||||
	      "0 10000000 10000000000000000000000");
 | 
			
		||||
    testBits (10,
 | 
			
		||||
	      "0 10010 0100000000",
 | 
			
		||||
	      "0 10000010 01000000000000000000000");
 | 
			
		||||
    testBits (0.1f,
 | 
			
		||||
	      "0 01011 1001100110",
 | 
			
		||||
	      "0 01111011 10011001100000000000000");
 | 
			
		||||
    testBits (0.2f,
 | 
			
		||||
	      "0 01100 1001100110",
 | 
			
		||||
	      "0 01111100 10011001100000000000000");
 | 
			
		||||
    testBits (0.3f,
 | 
			
		||||
	      "0 01101 0011001101",
 | 
			
		||||
	      "0 01111101 00110011010000000000000");
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Numbers close to HALF_MAX
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    testBits (HALF_MAX,
 | 
			
		||||
	      "0 11110 1111111111",
 | 
			
		||||
	      "0 10001110 11111111110000000000000");
 | 
			
		||||
    testBits ((1 << HALF_MAX_EXP) * 1.0,
 | 
			
		||||
	      "0 11111 0000000000",			// +infinity
 | 
			
		||||
	      "0 11111111 00000000000000000000000");	// +infinity
 | 
			
		||||
    testBits ((1 << HALF_MAX_EXP) * (1.0f - HALF_EPSILON * 0.25f),
 | 
			
		||||
	      "0 11111 0000000000",			// +infinity
 | 
			
		||||
	      "0 11111111 00000000000000000000000");	// +infinity
 | 
			
		||||
    testBits ((1 << HALF_MAX_EXP) * (1.0f - HALF_EPSILON * 0.25005f),
 | 
			
		||||
	      "0 11110 1111111111",
 | 
			
		||||
	      "0 10001110 11111111110000000000000");
 | 
			
		||||
    testBits ((1 << HALF_MAX_EXP) * (1.0f - HALF_EPSILON * 0.24995f),
 | 
			
		||||
	      "0 11111 0000000000",			// +infinity
 | 
			
		||||
	      "0 11111111 00000000000000000000000");	// +infinity
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Large positive numbers, positive infinity and NANs
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    testBits (HALF_MAX * HALF_MAX,
 | 
			
		||||
	      "0 11111 0000000000",			// +infinity
 | 
			
		||||
	      "0 11111111 00000000000000000000000");	// +infinity
 | 
			
		||||
    testBits (FLT_MAX,
 | 
			
		||||
	      "0 11111 0000000000",			// +infinity
 | 
			
		||||
	      "0 11111111 00000000000000000000000");	// +infinity
 | 
			
		||||
    testBits (floatPosInfinity(),
 | 
			
		||||
	      "0 11111 0000000000",			// +infinity
 | 
			
		||||
	      "0 11111111 00000000000000000000000");	// +infinity
 | 
			
		||||
    testBits (floatPosQNan1(),
 | 
			
		||||
	      "0 11111 1111111111",			// nan
 | 
			
		||||
	      "0 11111111 11111111110000000000000");	// nan
 | 
			
		||||
    testBits (floatPosQNan2(),
 | 
			
		||||
	      "0 11111 1010101010",			// nan
 | 
			
		||||
	      "0 11111111 10101010100000000000000");	// nan
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Numbers close to -1.0
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    testBits (-1.0,
 | 
			
		||||
	      "1 01111 0000000000",
 | 
			
		||||
	      "1 01111111 00000000000000000000000");
 | 
			
		||||
    testBits (-(1.0f + HALF_EPSILON),
 | 
			
		||||
	      "1 01111 0000000001",
 | 
			
		||||
	      "1 01111111 00000000010000000000000");
 | 
			
		||||
    testBits (-(1.0f + HALF_EPSILON * 0.5f),
 | 
			
		||||
	      "1 01111 0000000000",
 | 
			
		||||
	      "1 01111111 00000000000000000000000");
 | 
			
		||||
    testBits (-(1.0f + HALF_EPSILON * 0.4999f),
 | 
			
		||||
	      "1 01111 0000000000",
 | 
			
		||||
	      "1 01111111 00000000000000000000000");
 | 
			
		||||
    testBits (-(1.0f + HALF_EPSILON * 0.5001f),
 | 
			
		||||
	      "1 01111 0000000001",
 | 
			
		||||
	      "1 01111111 00000000010000000000000");
 | 
			
		||||
    testBits (-(1.0f + HALF_EPSILON + HALF_EPSILON),
 | 
			
		||||
	      "1 01111 0000000010",
 | 
			
		||||
	      "1 01111111 00000000100000000000000");
 | 
			
		||||
    testBits (-(1.0f + HALF_EPSILON + HALF_EPSILON * 0.5f),
 | 
			
		||||
	      "1 01111 0000000010",
 | 
			
		||||
	      "1 01111111 00000000100000000000000");
 | 
			
		||||
    testBits (-(1.0f + HALF_EPSILON + HALF_EPSILON * 0.4999f),
 | 
			
		||||
	      "1 01111 0000000001",
 | 
			
		||||
	      "1 01111111 00000000010000000000000");
 | 
			
		||||
    testBits (-(1.0f + HALF_EPSILON + HALF_EPSILON * 0.5001f),
 | 
			
		||||
	      "1 01111 0000000010",
 | 
			
		||||
	      "1 01111111 00000000100000000000000");
 | 
			
		||||
    testBits (-(1.0f - HALF_EPSILON * 0.5f),
 | 
			
		||||
	      "1 01110 1111111111",
 | 
			
		||||
	      "1 01111110 11111111110000000000000");
 | 
			
		||||
    testBits (-(1.0f - HALF_EPSILON * 0.5f * 0.5f),
 | 
			
		||||
	      "1 01111 0000000000",
 | 
			
		||||
	      "1 01111111 00000000000000000000000");
 | 
			
		||||
    testBits (-(1.0f - HALF_EPSILON * 0.5f * 0.4999f),
 | 
			
		||||
	      "1 01111 0000000000",
 | 
			
		||||
	      "1 01111111 00000000000000000000000");
 | 
			
		||||
    testBits (-(1.0f - HALF_EPSILON * 0.5f * 0.5001f),
 | 
			
		||||
	      "1 01110 1111111111",
 | 
			
		||||
	      "1 01111110 11111111110000000000000");
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Numbers close to -HALF_MIN
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    testBits (-HALF_MIN,
 | 
			
		||||
	      "1 00000 0000000001",
 | 
			
		||||
	      "1 01100111 00000000000000000000000");
 | 
			
		||||
    testBits (-(HALF_MIN + HALF_MIN),
 | 
			
		||||
	      "1 00000 0000000010",
 | 
			
		||||
	      "1 01101000 00000000000000000000000");
 | 
			
		||||
    testBits (-(HALF_MIN + HALF_MIN * 0.5f),
 | 
			
		||||
	      "1 00000 0000000010",
 | 
			
		||||
	      "1 01101000 00000000000000000000000");
 | 
			
		||||
    testBits (-(HALF_MIN + HALF_MIN * 0.4999f),
 | 
			
		||||
	      "1 00000 0000000001",
 | 
			
		||||
	      "1 01100111 00000000000000000000000");
 | 
			
		||||
    testBits (-(HALF_MIN + HALF_MIN * 0.5001f),
 | 
			
		||||
	      "1 00000 0000000010",
 | 
			
		||||
	      "1 01101000 00000000000000000000000");
 | 
			
		||||
    testBits (-(HALF_MIN - HALF_MIN),
 | 
			
		||||
	      "X 00000 0000000000",
 | 
			
		||||
	      "X 00000000 00000000000000000000000");
 | 
			
		||||
    testBits (-(HALF_MIN - HALF_MIN * 0.5f),
 | 
			
		||||
	      "1 00000 0000000000",
 | 
			
		||||
	      "1 00000000 00000000000000000000000");
 | 
			
		||||
    testBits (-(HALF_MIN - HALF_MIN * 0.4999f),
 | 
			
		||||
	      "1 00000 0000000001",
 | 
			
		||||
	      "1 01100111 00000000000000000000000");
 | 
			
		||||
    testBits (-(HALF_MIN - HALF_MIN * 0.5001f),
 | 
			
		||||
	      "1 00000 0000000000",
 | 
			
		||||
	      "1 00000000 00000000000000000000000");
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Numbers close to -HALF_NRM_MIN
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    testBits (-HALF_NRM_MIN,
 | 
			
		||||
	      "1 00001 0000000000",
 | 
			
		||||
	      "1 01110001 00000000000000000000000");
 | 
			
		||||
    testBits (-(HALF_NRM_MIN + HALF_MIN),
 | 
			
		||||
	      "1 00001 0000000001",
 | 
			
		||||
	      "1 01110001 00000000010000000000000");
 | 
			
		||||
    testBits (-(HALF_NRM_MIN + HALF_MIN * 0.5f),
 | 
			
		||||
	      "1 00001 0000000000",
 | 
			
		||||
	      "1 01110001 00000000000000000000000");
 | 
			
		||||
    testBits (-(HALF_NRM_MIN + HALF_MIN * 0.4999f),
 | 
			
		||||
	      "1 00001 0000000000",
 | 
			
		||||
	      "1 01110001 00000000000000000000000");
 | 
			
		||||
    testBits (-(HALF_NRM_MIN + HALF_MIN * 0.5001f),
 | 
			
		||||
	      "1 00001 0000000001",
 | 
			
		||||
	      "1 01110001 00000000010000000000000");
 | 
			
		||||
    testBits (-(HALF_NRM_MIN - HALF_MIN),
 | 
			
		||||
	      "1 00000 1111111111",
 | 
			
		||||
	      "1 01110000 11111111100000000000000");
 | 
			
		||||
    testBits (-(HALF_NRM_MIN - HALF_MIN * 0.5f),
 | 
			
		||||
	      "1 00001 0000000000",
 | 
			
		||||
	      "1 01110001 00000000000000000000000");
 | 
			
		||||
    testBits (-(HALF_NRM_MIN - HALF_MIN * 0.49995f),
 | 
			
		||||
	      "1 00001 0000000000",
 | 
			
		||||
	      "1 01110001 00000000000000000000000");
 | 
			
		||||
    testBits (-(HALF_NRM_MIN - HALF_MIN * 0.50005f),
 | 
			
		||||
	      "1 00000 1111111111",
 | 
			
		||||
	      "1 01110000 11111111100000000000000");
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Small negative integers and simple decimal fractions
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    testBits (-2,
 | 
			
		||||
	      "1 10000 0000000000",
 | 
			
		||||
	      "1 10000000 00000000000000000000000");
 | 
			
		||||
    testBits (-3,
 | 
			
		||||
	      "1 10000 1000000000",
 | 
			
		||||
	      "1 10000000 10000000000000000000000");
 | 
			
		||||
    testBits (-10,
 | 
			
		||||
	      "1 10010 0100000000",
 | 
			
		||||
	      "1 10000010 01000000000000000000000");
 | 
			
		||||
    testBits (-0.1f,
 | 
			
		||||
	      "1 01011 1001100110",
 | 
			
		||||
	      "1 01111011 10011001100000000000000");
 | 
			
		||||
    testBits (-0.2f,
 | 
			
		||||
	      "1 01100 1001100110",
 | 
			
		||||
	      "1 01111100 10011001100000000000000");
 | 
			
		||||
    testBits (-0.3f,
 | 
			
		||||
	      "1 01101 0011001101",
 | 
			
		||||
	      "1 01111101 00110011010000000000000");
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Numbers close to -HALF_MAX
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    testBits (-HALF_MAX,
 | 
			
		||||
	      "1 11110 1111111111",
 | 
			
		||||
	      "1 10001110 11111111110000000000000");
 | 
			
		||||
    testBits (-(1 << HALF_MAX_EXP) * 1.0f,
 | 
			
		||||
	      "1 11111 0000000000",			// +infinity
 | 
			
		||||
	      "1 11111111 00000000000000000000000");	// +infinity
 | 
			
		||||
    testBits (-(1 << HALF_MAX_EXP) * (1.0f - HALF_EPSILON * 0.25f),
 | 
			
		||||
	      "1 11111 0000000000",			// +infinity
 | 
			
		||||
	      "1 11111111 00000000000000000000000");	// +infinity
 | 
			
		||||
    testBits (-(1 << HALF_MAX_EXP) * (1.0f - HALF_EPSILON * 0.25005f),
 | 
			
		||||
	      "1 11110 1111111111",
 | 
			
		||||
	      "1 10001110 11111111110000000000000");
 | 
			
		||||
    testBits (-(1 << HALF_MAX_EXP) * (1.0f - HALF_EPSILON * 0.24995f),
 | 
			
		||||
	      "1 11111 0000000000",			// +infinity
 | 
			
		||||
	      "1 11111111 00000000000000000000000");	// +infinity
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Large negative numbers, negative infinity and NANs
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    testBits (-HALF_MAX * HALF_MAX,
 | 
			
		||||
	      "1 11111 0000000000",			// +infinity
 | 
			
		||||
	      "1 11111111 00000000000000000000000");	// +infinity
 | 
			
		||||
    testBits (-FLT_MAX,
 | 
			
		||||
	      "1 11111 0000000000",			// +infinity
 | 
			
		||||
	      "1 11111111 00000000000000000000000");	// +infinity
 | 
			
		||||
    testBits (floatNegInfinity(),
 | 
			
		||||
	      "1 11111 0000000000",			// +infinity
 | 
			
		||||
	      "1 11111111 00000000000000000000000");	// +infinity
 | 
			
		||||
    testBits (floatNegQNan1(),
 | 
			
		||||
	      "1 11111 1111111111",			// nan
 | 
			
		||||
	      "1 11111111 11111111110000000000000");	// nan
 | 
			
		||||
    testBits (floatNegQNan2(),
 | 
			
		||||
	      "1 11111 1010101010",			// nan
 | 
			
		||||
	      "1 11111111 10101010100000000000000");	// nan
 | 
			
		||||
 | 
			
		||||
    cout << "ok\n\n" << flush;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testBitPatterns.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testBitPatterns.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
 | 
			
		||||
void testBitPatterns ();
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										170
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testClassification.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testClassification.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,170 @@
 | 
			
		||||
#include <testClassification.h>
 | 
			
		||||
#include "half.h"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
testClass (half h,
 | 
			
		||||
	   bool finite,
 | 
			
		||||
	   bool normalized,
 | 
			
		||||
	   bool denormalized,
 | 
			
		||||
	   bool zero,
 | 
			
		||||
	   bool nan,
 | 
			
		||||
	   bool infinity,
 | 
			
		||||
	   bool negative)
 | 
			
		||||
{
 | 
			
		||||
    cout.width (15);
 | 
			
		||||
    cout.precision (8);
 | 
			
		||||
 | 
			
		||||
    cout << h << "    ";
 | 
			
		||||
    printBits (cout, h);
 | 
			
		||||
    cout << "    ";
 | 
			
		||||
 | 
			
		||||
    if (h.isFinite())
 | 
			
		||||
	cout << "finite ";
 | 
			
		||||
 | 
			
		||||
    if (h.isNormalized())
 | 
			
		||||
	cout << "normalized ";
 | 
			
		||||
 | 
			
		||||
    if (h.isDenormalized())
 | 
			
		||||
	cout << "denormalized ";
 | 
			
		||||
 | 
			
		||||
    if (h.isZero())
 | 
			
		||||
	cout << "zero ";
 | 
			
		||||
 | 
			
		||||
    if (h.isNan())
 | 
			
		||||
	cout << "nan ";
 | 
			
		||||
 | 
			
		||||
    if (h.isInfinity())
 | 
			
		||||
	cout << "infinity ";
 | 
			
		||||
 | 
			
		||||
    if (h.isNegative())
 | 
			
		||||
	cout << "negative ";
 | 
			
		||||
 | 
			
		||||
    cout << endl;
 | 
			
		||||
 | 
			
		||||
    assert (h.isFinite() == finite);
 | 
			
		||||
    assert (h.isNormalized() == normalized);
 | 
			
		||||
    assert (h.isDenormalized() == denormalized);
 | 
			
		||||
    assert (h.isZero() == zero);
 | 
			
		||||
    assert (h.isNan() == nan);
 | 
			
		||||
    assert (h.isInfinity() == infinity);
 | 
			
		||||
    assert (h.isNegative() == negative);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
floatPosInfinity ()
 | 
			
		||||
{
 | 
			
		||||
    half::uif x;
 | 
			
		||||
    x.i = 0x7f800000;
 | 
			
		||||
    return x.f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
floatNegInfinity ()
 | 
			
		||||
{
 | 
			
		||||
    half::uif x;
 | 
			
		||||
    x.i = 0xff800000;
 | 
			
		||||
    return x.f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
floatPosQNan1 ()
 | 
			
		||||
{
 | 
			
		||||
    half::uif x;
 | 
			
		||||
    x.i = 0x7fffffff;
 | 
			
		||||
    return x.f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
floatNegQNan1 ()
 | 
			
		||||
{
 | 
			
		||||
    half::uif x;
 | 
			
		||||
    x.i = 0xffffffff;
 | 
			
		||||
    return x.f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
floatPosQNan2 ()
 | 
			
		||||
{
 | 
			
		||||
    half::uif x;
 | 
			
		||||
    x.i = 0x7fd55555;
 | 
			
		||||
    return x.f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
floatNegQNan2 ()
 | 
			
		||||
{
 | 
			
		||||
    half::uif x;
 | 
			
		||||
    x.i = 0xffd55555;
 | 
			
		||||
    return x.f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
testClassification()
 | 
			
		||||
{
 | 
			
		||||
    cout << "classification of bit patterns\n\n";
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    //					fini norm deno zero nan  inf  neg
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    testClass (0.0,			1,   0,   0,   1,   0,   0,   0);
 | 
			
		||||
 | 
			
		||||
    testClass (1.0,			1,   1,   0,   0,   0,   0,   0);
 | 
			
		||||
    testClass (1.0f + HALF_EPSILON,	1,   1,   0,   0,   0,   0,   0);
 | 
			
		||||
    testClass (HALF_MIN,		1,   0,   1,   0,   0,   0,   0);
 | 
			
		||||
    testClass (HALF_MIN + HALF_MIN,	1,   0,   1,   0,   0,   0,   0);
 | 
			
		||||
    testClass (HALF_NRM_MIN,		1,   1,   0,   0,   0,   0,   0);
 | 
			
		||||
    testClass (HALF_NRM_MIN + HALF_MIN,	1,   1,   0,   0,   0,   0,   0);
 | 
			
		||||
    testClass (HALF_NRM_MIN - HALF_MIN,	1,   0,   1,   0,   0,   0,   0);
 | 
			
		||||
    testClass (2.0f,			1,   1,   0,   0,   0,   0,   0);
 | 
			
		||||
    testClass (3.0f,			1,   1,   0,   0,   0,   0,   0);
 | 
			
		||||
    testClass (0.1f,			1,   1,   0,   0,   0,   0,   0);
 | 
			
		||||
    testClass (0.2f,			1,   1,   0,   0,   0,   0,   0);
 | 
			
		||||
    testClass (0.3f,			1,   1,   0,   0,   0,   0,   0);
 | 
			
		||||
    testClass (HALF_MAX,		1,   1,   0,   0,   0,   0,   0);
 | 
			
		||||
    testClass (floatPosInfinity(),	0,   0,   0,   0,   0,   1,   0);
 | 
			
		||||
    testClass (floatPosQNan1(),		0,   0,   0,   0,   1,   0,   0);
 | 
			
		||||
    testClass (floatPosQNan2(),		0,   0,   0,   0,   1,   0,   0);
 | 
			
		||||
 | 
			
		||||
    testClass (-1.0f,			1,   1,   0,   0,   0,   0,   1);
 | 
			
		||||
    testClass (-1.0f - HALF_EPSILON,	1,   1,   0,   0,   0,   0,   1);
 | 
			
		||||
    testClass (-HALF_MIN,		1,   0,   1,   0,   0,   0,   1);
 | 
			
		||||
    testClass (-HALF_MIN - HALF_MIN,	1,   0,   1,   0,   0,   0,   1);
 | 
			
		||||
    testClass (-HALF_NRM_MIN,		1,   1,   0,   0,   0,   0,   1);
 | 
			
		||||
    testClass (-HALF_NRM_MIN - HALF_MIN,1,   1,   0,   0,   0,   0,   1);
 | 
			
		||||
    testClass (-HALF_NRM_MIN + HALF_MIN,1,   0,   1,   0,   0,   0,   1);
 | 
			
		||||
    testClass (-2.0f,			1,   1,   0,   0,   0,   0,   1);
 | 
			
		||||
    testClass (-3.0f,			1,   1,   0,   0,   0,   0,   1);
 | 
			
		||||
    testClass (-0.1f,			1,   1,   0,   0,   0,   0,   1);
 | 
			
		||||
    testClass (-0.2f,			1,   1,   0,   0,   0,   0,   1);
 | 
			
		||||
    testClass (-0.3f,			1,   1,   0,   0,   0,   0,   1);
 | 
			
		||||
    testClass (-HALF_MAX,		1,   1,   0,   0,   0,   0,   1);
 | 
			
		||||
    testClass (floatNegInfinity(),	0,   0,   0,   0,   0,   1,   1);
 | 
			
		||||
    testClass (floatNegQNan1(),		0,   0,   0,   0,   1,   0,   1);
 | 
			
		||||
    testClass (floatNegQNan2(),		0,   0,   0,   0,   1,   0,   1);
 | 
			
		||||
 | 
			
		||||
    cout << "\n";
 | 
			
		||||
 | 
			
		||||
    testClass (half::posInf(),		0,   0,   0,   0,   0,   1,   0);
 | 
			
		||||
    testClass (half::negInf(),		0,   0,   0,   0,   0,   1,   1);
 | 
			
		||||
    testClass (half::qNan(),		0,   0,   0,   0,   1,   0,   0);
 | 
			
		||||
    testClass (half::sNan(),		0,   0,   0,   0,   1,   0,   0);
 | 
			
		||||
 | 
			
		||||
    cout << "ok\n\n" << flush;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,3 @@
 | 
			
		||||
 | 
			
		||||
void testClassification ();
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										212
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testError.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testError.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,212 @@
 | 
			
		||||
#include <testError.h>
 | 
			
		||||
#include "half.h"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
drand()
 | 
			
		||||
{
 | 
			
		||||
    return static_cast<float> (rand()/(RAND_MAX+1.0f));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
testNormalizedConversionError()
 | 
			
		||||
{
 | 
			
		||||
    cout << "float-to-half conversion error for normalized half numbers\n";
 | 
			
		||||
 | 
			
		||||
    float eMax = 0;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < 20000000; i++)
 | 
			
		||||
    {
 | 
			
		||||
	float f (drand() * HALF_MAX);
 | 
			
		||||
 | 
			
		||||
	if (f < HALF_NRM_MIN)
 | 
			
		||||
	    continue;
 | 
			
		||||
 | 
			
		||||
	if (i & 1)
 | 
			
		||||
	    f = -f;
 | 
			
		||||
 | 
			
		||||
	half h (f);
 | 
			
		||||
	float e = 1.0f - h/f;
 | 
			
		||||
 | 
			
		||||
	if (e < 0)
 | 
			
		||||
	    e = -e;
 | 
			
		||||
 | 
			
		||||
	if (e > HALF_EPSILON * 0.5)
 | 
			
		||||
	{
 | 
			
		||||
	    cout << "float = " << f <<
 | 
			
		||||
		    ", half = " << h <<
 | 
			
		||||
		    ", error = " << e << endl;
 | 
			
		||||
 | 
			
		||||
	    assert (false);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (e > eMax)
 | 
			
		||||
	    eMax = e;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cout << "max error          = " << eMax << endl;
 | 
			
		||||
    cout << "max expected error = " << HALF_EPSILON * 0.5 << endl;
 | 
			
		||||
    cout << "ok\n\n" << flush;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
testDenormalizedConversionError()
 | 
			
		||||
{
 | 
			
		||||
    cout << "float-to-half conversion error for denormalized half numbers\n";
 | 
			
		||||
 | 
			
		||||
    float eMax = 0;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < 20000000; i++)
 | 
			
		||||
    {
 | 
			
		||||
	float f (drand() * (HALF_NRM_MIN - HALF_MIN));
 | 
			
		||||
 | 
			
		||||
	if (i & 1)
 | 
			
		||||
	    f = -f;
 | 
			
		||||
 | 
			
		||||
	half h (f);
 | 
			
		||||
	float e = h - f;
 | 
			
		||||
 | 
			
		||||
	if (e < 0)
 | 
			
		||||
	    e = -e;
 | 
			
		||||
 | 
			
		||||
	if (e > HALF_MIN * 0.5)
 | 
			
		||||
	{
 | 
			
		||||
	    cout << "float = " << f <<
 | 
			
		||||
		    ", half = " << h <<
 | 
			
		||||
		    ", error = " << e << endl;
 | 
			
		||||
 | 
			
		||||
	    assert (false);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (e > eMax)
 | 
			
		||||
	    eMax = e;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cout << "max error          = " << eMax << endl;
 | 
			
		||||
    cout << "max expected error = " << HALF_MIN * 0.5 << endl;
 | 
			
		||||
    cout << "ok\n\n" << flush;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
testNormalizedRounding (int n)
 | 
			
		||||
{
 | 
			
		||||
    cout << "rounding normalized numbers to " << n << "-bit precision\n";
 | 
			
		||||
 | 
			
		||||
    float eExpected = (n < 10)? HALF_EPSILON * 0.5f * (1 << (10 - n)): 0;
 | 
			
		||||
    float eMax = 0;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < 200000; i++)
 | 
			
		||||
    {
 | 
			
		||||
	half h (drand() * HALF_MAX);
 | 
			
		||||
 | 
			
		||||
	if (h < HALF_NRM_MIN)
 | 
			
		||||
	    continue;
 | 
			
		||||
 | 
			
		||||
	if (i & 1)
 | 
			
		||||
	    h = -h;
 | 
			
		||||
 | 
			
		||||
	half r (h.round(n));
 | 
			
		||||
	float e = 1.0f - r/h;
 | 
			
		||||
 | 
			
		||||
	if (e < 0)
 | 
			
		||||
	    e = -e;
 | 
			
		||||
 | 
			
		||||
	if (e > eExpected)
 | 
			
		||||
	{
 | 
			
		||||
	    cout << "half = " << h <<
 | 
			
		||||
		    ", rounded = " << r <<
 | 
			
		||||
		    ", error = " << e <<
 | 
			
		||||
		    ", expected error = " << eExpected << endl;
 | 
			
		||||
 | 
			
		||||
	    printBits (cout, h);
 | 
			
		||||
	    cout << endl;
 | 
			
		||||
	    printBits (cout, r);
 | 
			
		||||
	    cout << endl;
 | 
			
		||||
 | 
			
		||||
	    assert (false);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (e > eMax)
 | 
			
		||||
	    eMax = e;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cout << "max error          = " << eMax << endl;
 | 
			
		||||
    cout << "max expected error = " << eExpected << endl;
 | 
			
		||||
    cout << "ok\n\n" << flush;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
testDenormalizedRounding (int n)
 | 
			
		||||
{
 | 
			
		||||
    cout << "rounding denormalized numbers to " << n << "-bit precision\n";
 | 
			
		||||
 | 
			
		||||
    float eExpected = (n < 10)? HALF_MIN * 0.5f * (1 << (10 - n)): 0;
 | 
			
		||||
    float eMax = 0;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < 200000; i++)
 | 
			
		||||
    {
 | 
			
		||||
	half h (drand() * (HALF_NRM_MIN - HALF_MIN));
 | 
			
		||||
 | 
			
		||||
	if (i & 1)
 | 
			
		||||
	    h = -h;
 | 
			
		||||
 | 
			
		||||
	half r (h.round(n));
 | 
			
		||||
	float e = r - h;
 | 
			
		||||
 | 
			
		||||
	if (e < 0)
 | 
			
		||||
	    e = -e;
 | 
			
		||||
 | 
			
		||||
	if (e > eExpected)
 | 
			
		||||
	{
 | 
			
		||||
	    cout << "half = " << h <<
 | 
			
		||||
		    ", rounded = " << r <<
 | 
			
		||||
		    ", error = " << e <<
 | 
			
		||||
		    ", expected error = " << eExpected << endl;
 | 
			
		||||
 | 
			
		||||
	    printBits (cout, h);
 | 
			
		||||
	    cout << endl;
 | 
			
		||||
	    printBits (cout, r);
 | 
			
		||||
	    cout << endl;
 | 
			
		||||
 | 
			
		||||
	    assert (false);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (e > eMax)
 | 
			
		||||
	    eMax = e;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cout << "max error          = " << eMax << endl;
 | 
			
		||||
    cout << "max expected error = " << eExpected << endl;
 | 
			
		||||
    cout << "ok\n\n" << flush;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
testRoundingError ()
 | 
			
		||||
{
 | 
			
		||||
    testNormalizedRounding (10);
 | 
			
		||||
    testDenormalizedRounding (10);
 | 
			
		||||
    testNormalizedRounding (9);
 | 
			
		||||
    testDenormalizedRounding (9);
 | 
			
		||||
    testNormalizedRounding (1);
 | 
			
		||||
    testDenormalizedRounding (1);
 | 
			
		||||
    testNormalizedRounding (0);
 | 
			
		||||
    testDenormalizedRounding (0);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testError.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testError.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
 | 
			
		||||
void testNormalizedConversionError ();
 | 
			
		||||
void testDenormalizedConversionError ();
 | 
			
		||||
void testRoundingError ();
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										68
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testFunction.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testFunction.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,68 @@
 | 
			
		||||
#include <testFunction.h>
 | 
			
		||||
#include "halfFunction.h"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
divideByTwo (float x)
 | 
			
		||||
{
 | 
			
		||||
    return x / 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct timesN
 | 
			
		||||
{
 | 
			
		||||
    timesN (float n): n (n) {}
 | 
			
		||||
    float operator () (float x) {return x * n;}
 | 
			
		||||
    float n;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
testFunction ()
 | 
			
		||||
{
 | 
			
		||||
    cout << "halfFunction<T>\n";
 | 
			
		||||
 | 
			
		||||
    halfFunction <float> d2 (divideByTwo);
 | 
			
		||||
 | 
			
		||||
    assert (d2 (0)  ==  0);
 | 
			
		||||
    assert (d2 (2)  ==  1);
 | 
			
		||||
    assert (d2 (-2) == -1);
 | 
			
		||||
    assert (d2 (HALF_MAX)  ==  HALF_MAX / 2);
 | 
			
		||||
    assert (d2 (-HALF_MAX) == -HALF_MAX / 2);
 | 
			
		||||
    assert (d2 (half::posInf()) == 0);
 | 
			
		||||
    assert (d2 (half::negInf()) == 0);
 | 
			
		||||
    assert (d2 (half::qNan())   == 0);
 | 
			
		||||
 | 
			
		||||
    halfFunction <half> t5 (timesN (5),		// function
 | 
			
		||||
			    0, HALF_MAX / 8,	// domain
 | 
			
		||||
			    -1,			// default value
 | 
			
		||||
			    half::posInf(),	// posInfValue
 | 
			
		||||
			    half::negInf(),	// negInfValue
 | 
			
		||||
			    half::qNan());	// nanValue
 | 
			
		||||
 | 
			
		||||
    assert (t5 (0)  ==  0);
 | 
			
		||||
    assert (t5 (2)  == 10);
 | 
			
		||||
    assert (t5 (-2) == -1);
 | 
			
		||||
    assert (t5 (HALF_MAX)  == -1);
 | 
			
		||||
    assert (t5 (-HALF_MAX) == -1);
 | 
			
		||||
 | 
			
		||||
    assert ( t5(half::posInf()).isInfinity());
 | 
			
		||||
    assert (!t5(half::posInf()).isNegative());
 | 
			
		||||
 | 
			
		||||
    assert (t5(half::negInf()).isInfinity());
 | 
			
		||||
    assert (t5(half::negInf()).isNegative());
 | 
			
		||||
 | 
			
		||||
    assert (t5(half::qNan()).isNan());
 | 
			
		||||
 | 
			
		||||
    cout << "ok\n\n" << flush;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testFunction.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testFunction.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
 | 
			
		||||
void testFunction ();
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										94
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testLimits.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testLimits.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,94 @@
 | 
			
		||||
#include <testLimits.h>
 | 
			
		||||
#include "halfLimits.h"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
mypow (int x, int y)
 | 
			
		||||
{
 | 
			
		||||
    bool negative = false;
 | 
			
		||||
 | 
			
		||||
    if (y < 0)
 | 
			
		||||
    {
 | 
			
		||||
	negative = true;
 | 
			
		||||
	y = -y;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    float z = 1;
 | 
			
		||||
 | 
			
		||||
    while (y > 0)
 | 
			
		||||
    {
 | 
			
		||||
	z *= x;
 | 
			
		||||
	y -= 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (negative)
 | 
			
		||||
	z = 1 / z;
 | 
			
		||||
 | 
			
		||||
    return z;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
testLimits()
 | 
			
		||||
{
 | 
			
		||||
    cout << "values in std::numeric_limits<half>\n";
 | 
			
		||||
 | 
			
		||||
    cout << "min_exponent\n";
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	half h (mypow (2, numeric_limits<half>::min_exponent - 1));
 | 
			
		||||
	assert (h.isNormalized());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	half h (mypow (2, numeric_limits<half>::min_exponent - 2));
 | 
			
		||||
	assert (h.isDenormalized());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cout << "max_exponent\n";
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	half h (mypow (2, numeric_limits<half>::max_exponent - 1));
 | 
			
		||||
	assert (h.isNormalized());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	half h (mypow (2, numeric_limits<half>::max_exponent));
 | 
			
		||||
	assert (h.isInfinity());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cout << "min_exponent10\n";
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	half h (mypow (10, numeric_limits<half>::min_exponent10));
 | 
			
		||||
	assert (h.isNormalized());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	half h (mypow (10, numeric_limits<half>::min_exponent10 - 1));
 | 
			
		||||
	assert (h.isDenormalized());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cout << "max_exponent10\n";
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	half h (mypow (10, numeric_limits<half>::max_exponent10));
 | 
			
		||||
	assert (h.isNormalized());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
	half h (mypow (10, numeric_limits<half>::max_exponent10 + 1));
 | 
			
		||||
	assert (h.isInfinity());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cout << "ok\n\n" << flush;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testLimits.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testLimits.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
 | 
			
		||||
void testLimits ();
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										27
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testSize.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testSize.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
#include <testSize.h>
 | 
			
		||||
#include "half.h"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
testSize ()
 | 
			
		||||
{
 | 
			
		||||
    cout << "size and alignment\n";
 | 
			
		||||
 | 
			
		||||
    half h[2];
 | 
			
		||||
 | 
			
		||||
    int size = sizeof (half);
 | 
			
		||||
    ptrdiff_t algn = (char *)&h[1] - (char *)&h[0];
 | 
			
		||||
 | 
			
		||||
    cout << "sizeof  (half) = " << size << endl;
 | 
			
		||||
    cout << "alignof (half) = " << (int) algn << endl;
 | 
			
		||||
 | 
			
		||||
    assert (size == 2 && algn == 2);
 | 
			
		||||
 | 
			
		||||
    cout << "ok\n\n" << flush;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testSize.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cs440-acg/ext/openexr/IlmBase/HalfTest/testSize.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
 | 
			
		||||
void testSize ();
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user