52 int n_frac = 0, n_exp = 0;
53 int i, nan, sign = 0, exponent;
60 case IEEE_FMT_S: n_frac = 23; n_exp = 8;
break;
61 case IEEE_FMT_W: n_frac = 31; n_exp = 0;
break;
62 case IEEE_FMT_D: n_frac = 52; n_exp = 11;
break;
63 case IEEE_FMT_L: n_frac = 63; n_exp = 0;
break;
64 default:
fatal(
"ieee_interpret_float_value(): " 65 "unimplemented format %i\n", fmt);
78 exponent = (x >> n_frac) & ((1 << n_exp) - 1);
79 exponent -= (1 << (n_exp-1)) - 1;
81 default:
fatal(
"ieee_interpret_float_value(): unimplemented " 89 if (x == 0x7fffffffULL || x == 0x7fbfffffULL)
93 if (x == 0x7fffffffffffffffULL ||
94 x == 0x7ff7ffffffffffffULL)
101 goto no_reasonable_result;
122 sign = (x >> 31) & 1;
124 sign = (x >> 63) & 1;
127 for (i=0; i<n_frac; i++) {
128 int bit = (x >> i) & 1;
134 fraction = (fraction / 2.0) + 1.0;
136 default:
fatal(
"ieee_interpret_float_value(): " 137 "unimplemented format %i\n", fmt);
144 fatal(
"{ ieee: x=%016"PRIx64
" sign=%i exponent=%i frac=%f ",
145 (uint64_t) x, sign, exponent, fraction);
158 if (exponent == 1024)
161 while (exponent-- > 0)
163 }
else if (exponent < 0) {
164 while (exponent++ < 0)
171 no_reasonable_result:
175 fatal(
"f=%f }\n", fvp->
f);
187 int n_frac = 0, n_exp = 0, signofs=0;
194 case IEEE_FMT_S: n_frac = 23; n_exp = 8; signofs = 31;
break;
195 case IEEE_FMT_W: n_frac = 31; n_exp = 0; signofs = 31;
break;
196 case IEEE_FMT_D: n_frac = 52; n_exp = 11; signofs = 63;
break;
197 case IEEE_FMT_L: n_frac = 63; n_exp = 0; signofs = 63;
break;
198 default:
fatal(
"ieee_store_float_value(): unimplemented format" 224 fatal(
"{ ieee store f=%f ", nf);
228 r |= ((uint64_t)1 << signofs);
241 while (nf < 1.0 && exponent > -1023) {
245 while (nf >= 2.0 && exponent < 1023) {
255 for (i=n_frac-1; i>=0; i--) {
258 r |= ((uint64_t)1 << i);
265 exponent += (((uint64_t)1 << (n_exp-1)) - 1);
268 if (exponent >= ((int64_t)1 << n_exp))
269 exponent = ((int64_t)1 << n_exp) - 1;
270 r |= (uint64_t)exponent << n_frac;
277 fatal(
" exp=%i, r = %016"PRIx64
" }\n", exponent, (uint64_t) r);
281 fatal(
"ieee_store_float_value(): unimplemented format %i\n",
290 r = 0x7fffffffffffffffULL;
void fatal(const char *fmt,...)
uint64_t ieee_store_float_value(double nf, int fmt, int nan)
void ieee_interpret_float_value(uint64_t x, struct ieee_float_value *fvp, int fmt)