Blame HalfTest/testError.cpp

Packit 8dc392
#include <testError.h>
Packit 8dc392
#include "half.h"
Packit 8dc392
#include <iostream>
Packit 8dc392
#include <stdlib.h>
Packit 8dc392
#include <assert.h>
Packit 8dc392
Packit 8dc392
Packit 8dc392
using namespace std;
Packit 8dc392
Packit 8dc392
namespace {
Packit 8dc392
Packit 8dc392
float
Packit 8dc392
drand()
Packit 8dc392
{
Packit 8dc392
    return static_cast<float> (rand()/(RAND_MAX+1.0f));
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
} // namespace
Packit 8dc392
Packit 8dc392
Packit 8dc392
void
Packit 8dc392
testNormalizedConversionError()
Packit 8dc392
{
Packit 8dc392
    cout << "float-to-half conversion error for normalized half numbers\n";
Packit 8dc392
Packit 8dc392
    float eMax = 0;
Packit 8dc392
Packit 8dc392
    for (int i = 0; i < 20000000; i++)
Packit 8dc392
    {
Packit 8dc392
	float f (drand() * HALF_MAX);
Packit 8dc392
Packit 8dc392
	if (f < HALF_NRM_MIN)
Packit 8dc392
	    continue;
Packit 8dc392
Packit 8dc392
	if (i & 1)
Packit 8dc392
	    f = -f;
Packit 8dc392
Packit 8dc392
	half h (f);
Packit 8dc392
	float e = 1.0f - h/f;
Packit 8dc392
Packit 8dc392
	if (e < 0)
Packit 8dc392
	    e = -e;
Packit 8dc392
Packit 8dc392
	if (e > HALF_EPSILON * 0.5)
Packit 8dc392
	{
Packit 8dc392
	    cout << "float = " << f <<
Packit 8dc392
		    ", half = " << h <<
Packit 8dc392
		    ", error = " << e << endl;
Packit 8dc392
Packit 8dc392
	    assert (false);
Packit 8dc392
	}
Packit 8dc392
Packit 8dc392
	if (e > eMax)
Packit 8dc392
	    eMax = e;
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    cout << "max error          = " << eMax << endl;
Packit 8dc392
    cout << "max expected error = " << HALF_EPSILON * 0.5 << endl;
Packit 8dc392
    cout << "ok\n\n" << flush;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
Packit 8dc392
void
Packit 8dc392
testDenormalizedConversionError()
Packit 8dc392
{
Packit 8dc392
    cout << "float-to-half conversion error for denormalized half numbers\n";
Packit 8dc392
Packit 8dc392
    float eMax = 0;
Packit 8dc392
Packit 8dc392
    for (int i = 0; i < 20000000; i++)
Packit 8dc392
    {
Packit 8dc392
	float f (drand() * (HALF_NRM_MIN - HALF_MIN));
Packit 8dc392
Packit 8dc392
	if (i & 1)
Packit 8dc392
	    f = -f;
Packit 8dc392
Packit 8dc392
	half h (f);
Packit 8dc392
	float e = h - f;
Packit 8dc392
Packit 8dc392
	if (e < 0)
Packit 8dc392
	    e = -e;
Packit 8dc392
Packit 8dc392
	if (e > HALF_MIN * 0.5)
Packit 8dc392
	{
Packit 8dc392
	    cout << "float = " << f <<
Packit 8dc392
		    ", half = " << h <<
Packit 8dc392
		    ", error = " << e << endl;
Packit 8dc392
Packit 8dc392
	    assert (false);
Packit 8dc392
	}
Packit 8dc392
Packit 8dc392
	if (e > eMax)
Packit 8dc392
	    eMax = e;
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    cout << "max error          = " << eMax << endl;
Packit 8dc392
    cout << "max expected error = " << HALF_MIN * 0.5 << endl;
Packit 8dc392
    cout << "ok\n\n" << flush;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
Packit 8dc392
namespace {
Packit 8dc392
Packit 8dc392
void
Packit 8dc392
testNormalizedRounding (int n)
Packit 8dc392
{
Packit 8dc392
    cout << "rounding normalized numbers to " << n << "-bit precision\n";
Packit 8dc392
Packit 8dc392
    float eExpected = (n < 10)? HALF_EPSILON * 0.5f * (1 << (10 - n)): 0;
Packit 8dc392
    float eMax = 0;
Packit 8dc392
Packit 8dc392
    for (int i = 0; i < 200000; i++)
Packit 8dc392
    {
Packit 8dc392
	half h (drand() * HALF_MAX);
Packit 8dc392
Packit 8dc392
	if (h < HALF_NRM_MIN)
Packit 8dc392
	    continue;
Packit 8dc392
Packit 8dc392
	if (i & 1)
Packit 8dc392
	    h = -h;
Packit 8dc392
Packit 8dc392
	half r (h.round(n));
Packit 8dc392
	float e = 1.0f - r/h;
Packit 8dc392
Packit 8dc392
	if (e < 0)
Packit 8dc392
	    e = -e;
Packit 8dc392
Packit 8dc392
	if (e > eExpected)
Packit 8dc392
	{
Packit 8dc392
	    cout << "half = " << h <<
Packit 8dc392
		    ", rounded = " << r <<
Packit 8dc392
		    ", error = " << e <<
Packit 8dc392
		    ", expected error = " << eExpected << endl;
Packit 8dc392
Packit 8dc392
	    printBits (cout, h);
Packit 8dc392
	    cout << endl;
Packit 8dc392
	    printBits (cout, r);
Packit 8dc392
	    cout << endl;
Packit 8dc392
Packit 8dc392
	    assert (false);
Packit 8dc392
	}
Packit 8dc392
Packit 8dc392
	if (e > eMax)
Packit 8dc392
	    eMax = e;
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    cout << "max error          = " << eMax << endl;
Packit 8dc392
    cout << "max expected error = " << eExpected << endl;
Packit 8dc392
    cout << "ok\n\n" << flush;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
Packit 8dc392
void
Packit 8dc392
testDenormalizedRounding (int n)
Packit 8dc392
{
Packit 8dc392
    cout << "rounding denormalized numbers to " << n << "-bit precision\n";
Packit 8dc392
Packit 8dc392
    float eExpected = (n < 10)? HALF_MIN * 0.5f * (1 << (10 - n)): 0;
Packit 8dc392
    float eMax = 0;
Packit 8dc392
Packit 8dc392
    for (int i = 0; i < 200000; i++)
Packit 8dc392
    {
Packit 8dc392
	half h (drand() * (HALF_NRM_MIN - HALF_MIN));
Packit 8dc392
Packit 8dc392
	if (i & 1)
Packit 8dc392
	    h = -h;
Packit 8dc392
Packit 8dc392
	half r (h.round(n));
Packit 8dc392
	float e = r - h;
Packit 8dc392
Packit 8dc392
	if (e < 0)
Packit 8dc392
	    e = -e;
Packit 8dc392
Packit 8dc392
	if (e > eExpected)
Packit 8dc392
	{
Packit 8dc392
	    cout << "half = " << h <<
Packit 8dc392
		    ", rounded = " << r <<
Packit 8dc392
		    ", error = " << e <<
Packit 8dc392
		    ", expected error = " << eExpected << endl;
Packit 8dc392
Packit 8dc392
	    printBits (cout, h);
Packit 8dc392
	    cout << endl;
Packit 8dc392
	    printBits (cout, r);
Packit 8dc392
	    cout << endl;
Packit 8dc392
Packit 8dc392
	    assert (false);
Packit 8dc392
	}
Packit 8dc392
Packit 8dc392
	if (e > eMax)
Packit 8dc392
	    eMax = e;
Packit 8dc392
    }
Packit 8dc392
Packit 8dc392
    cout << "max error          = " << eMax << endl;
Packit 8dc392
    cout << "max expected error = " << eExpected << endl;
Packit 8dc392
    cout << "ok\n\n" << flush;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
} // namespace
Packit 8dc392
Packit 8dc392
Packit 8dc392
void
Packit 8dc392
testRoundingError ()
Packit 8dc392
{
Packit 8dc392
    testNormalizedRounding (10);
Packit 8dc392
    testDenormalizedRounding (10);
Packit 8dc392
    testNormalizedRounding (9);
Packit 8dc392
    testDenormalizedRounding (9);
Packit 8dc392
    testNormalizedRounding (1);
Packit 8dc392
    testDenormalizedRounding (1);
Packit 8dc392
    testNormalizedRounding (0);
Packit 8dc392
    testDenormalizedRounding (0);
Packit 8dc392
}