45 lines
813 B
C
45 lines
813 B
C
#include <assert.h>
|
|
#include <math.h>
|
|
#include <limits.h>
|
|
|
|
/* Access bit-level representation of floating-point number */
|
|
typedef unsigned float_bits;
|
|
|
|
/* computs 0.5*f. If f is NaN, then return f. */
|
|
float_bits float_half(float_bits uf) {
|
|
float_bits s = uf & 0x80000000, f = uf & 0x007FFFFF, e = (uf >> 23) & 0xFF;
|
|
|
|
if (e == 0xFF) {
|
|
return uf;
|
|
}
|
|
|
|
if (e > 1) {
|
|
e--;
|
|
return s | (e << 23) | f;
|
|
}
|
|
|
|
if (e == 1) {
|
|
f |= 1 << 23;
|
|
e = 0;
|
|
}
|
|
int t = f;
|
|
f >>= 1;
|
|
if (t & f & 1) {
|
|
f++;
|
|
}
|
|
return s | (e << 23) | f;
|
|
}
|
|
|
|
int main() {
|
|
for (float_bits x = 0; ; x++) {
|
|
float *a = (float*) &x;
|
|
float b = 0.5 * *a;
|
|
float_bits c = float_half(x);
|
|
float *d = (float*) &c;
|
|
assert(b == *d || (isnan(b) && isnan(*d)));
|
|
|
|
if (x == UINT_MAX) {
|
|
break;
|
|
}
|
|
}
|
|
} |