float64 runtime·Inf(int32 sign) { if(sign >= 0) return runtime·float64frombits(uvinf); else return runtime·float64frombits(uvneginf); }
float64 runtime·modf(float64 d, float64 *ip) { float64 dd; uint64 x; int32 e; if(d < 1) { if(d < 0) { d = runtime·modf(-d, ip); *ip = -*ip; return -d; } *ip = 0; return d; } x = runtime·float64tobits(d); e = (int32)((x >> SHIFT) & MASK) - BIAS; /* * Keep the top 11+e bits; clear the rest. */ if(e <= 64-11) x &= ~(((uint64)1 << (64LL-11LL-e))-1); dd = runtime·float64frombits(x); *ip = dd; return d - dd; }
int main (void) { double a = float64frombits (2); if (sqrt (a) != 3.1434555694052576e-162) __builtin_abort (); return 0; }
float64 runtime·frexp(float64 d, int32 *ep) { uint64 x; if(d == 0) { *ep = 0; return 0; } x = runtime·float64tobits(d); *ep = (int32)((x >> SHIFT) & MASK) - BIAS; x &= ~((uint64)MASK << SHIFT); x |= (uint64)BIAS << SHIFT; return runtime·float64frombits(x); }
float64 runtime·ldexp(float64 d, int32 e) { uint64 x; if(d == 0) return 0; x = runtime·float64tobits(d); e += (int32)(x >> SHIFT) & MASK; if(e <= 0) return 0; /* underflow */ if(e >= MASK){ /* overflow */ if(d < 0) return runtime·Inf(-1); return runtime·Inf(1); } x &= ~((uint64)MASK << SHIFT); x |= (uint64)e << SHIFT; return runtime·float64frombits(x); }
float64 runtime·NaN(void) { return runtime·float64frombits(uvnan); }