#include #include #include #define write_string(x) printf(x) #define write_int(x) printf( "%08X", x ) int do_fsca(int angle, float *a, float *b); float do_fsrra( float param ); float do_fipr( float *vectora, float *vectorb ); float do_fipr2( float *vectora, float *vectorb ); void do_ftrv( float *matrix, float *vector ); void do_ftrv2( float *matrix, float *vector ); unsigned int get_fpscr(); void set_fpscr( unsigned int fpscr ); #define MAX_FLOAT_DIFF 0.00001 static inline float inttof( unsigned int i ) { return *((float *)&i); } static inline double longtod( unsigned long long l ) { return *((double *)&l); } static inline unsigned int ftoint( float f ) { return *((unsigned int *)&f); } static inline unsigned long long dtolong( double d ) { return *((unsigned long long *)&d); } #define QNANF inttof(0x7FBFFFFF) #define QNAND longtod(0x7FF7FFFFFFFFFFFFLL) int compare_float( float a, float b ) { if( ftoint(a) == ftoint(b) ) /* Exact bit-pattern match */ return 1; float diff = (a>b?(a-b):(b-a)); return diff < MAX_FLOAT_DIFF; } #define FTOINT(a) (*((unsigned int *)&a)) #define TEST_FEQUALS( a, b ) if( !compare_float(a,b) ) { printf( "Assertion failed at %s.%d: expected %.8f (%08X) but was %.8f (%08X)\n", __FILE__, __LINE__, a, FTOINT(a), b, FTOINT(b) ); return 1; } int test_fsca( int angle, float expect_a, float expect_b ) { float a = 10.0; float b = 10.0; do_fsca(angle, &a, &b ); TEST_FEQUALS(expect_a, a); TEST_FEQUALS(expect_b, b); } int test_fsrra( float f, float expect ) { float f2 = do_fsrra( f ); TEST_FEQUALS( expect, f2 ); } void test_coercion( float f ) { double d = (double)f; float q = (float)d; unsigned int i = (unsigned int)d; signed int j = (signed int)q; printf( "Coerce: %08X %08X%08X %08X %08X %08X\n", *((unsigned int *)&f), *((unsigned int *)&d), *(((unsigned int *)&d)+1), *((unsigned int *)&q), i, j ); } void test_doublearr( int len ) { double arr[len]; unsigned int *iarr = (unsigned int *)&arr; int i; arr[0] = 2.5; for( i=1; i