/* Testing Code */ #include <limits.h> #include <math.h> /* Routines used by floation point test code */ /* Convert from bit level representation to floating point number */ float u2f(unsigned u) { union { unsigned u; float f; } a; a.u = u; return a.f; } /* Convert from floating point number to bit-level representation */ unsigned f2u(float f) { union { unsigned u; float f; } a; a.f = f; return a.u; } //1 int test_bitXor(int x, int y) { return x^y; } int test_tmin(void) { return 0x80000000; } //2 int test_isTmax(int x) { return x == 0x7FFFFFFF; } int test_allOddBits(int x) { int i; for (i = 1; i < 32; i+=2) if ((x & (1<<i)) == 0) return 0; return 1; } int test_negate(int x) { return -x; } //3 int test_isAsciiDigit(int x) { return (0x30 <= x) && (x <= 0x39); } int test_conditional(int x, int y, int z) { return x?y:z; } int test_isLessOrEqual(int x, int y) { return x <= y; } //4 int test_logicalNeg(int x) { return !x; } int test_howManyBits(int x) { unsigned int a, cnt; x = x<0 ? -x-1 : x; a = (unsigned int)x; for (cnt=0; a; a>>=1, cnt++) ; return (int)(cnt + 1); } //float unsigned test_floatScale2(unsigned uf) { float f = u2f(uf); float tf = 2*f; if (isnan(f)) return uf; else return f2u(tf); } int test_floatFloat2Int(unsigned uf) { float f = u2f(uf); int x = (int) f; return x; } unsigned test_floatPower2(int x) { float result = 1.0; float p2 = 2.0; int recip = (x < 0); /* treat tmin specially */ if ((unsigned)x == 0x80000000) { return 0; } if (recip) { x = -x; p2 = 0.5; } while (x > 0) { if (x & 0x1) result = result * p2; p2 = p2 * p2; x >>= 1; } return f2u(result); }