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