1b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 2b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* @(#)s_frexp.c 1.4 95/01/18 */ 3b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* 4b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ==================================================== 5b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 6b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 7b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Developed at SunSoft, a Sun Microsystems, Inc. business. 8b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Permission to use, copy, modify, and distribute this 9b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * software is freely granted, provided that this notice 10b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * is preserved. 11b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ==================================================== 12b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project */ 13b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 14b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* 15b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * for non-zero x 16b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * x = ieee_frexp(arg,&exp); 17b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * return a double fp quantity x such that 0.5 <= |x| <1.0 18b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * and the corresponding binary exponent "exp". That is 19b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * arg = x*2^exp. 20b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * If arg is inf, 0.0, or NaN, then ieee_frexp(arg,&exp) returns arg 21b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * with *exp=0. 22b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project */ 23b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 24b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#include "fdlibm.h" 25b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 26b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#ifdef __STDC__ 27b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projectstatic const double 28b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#else 29b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projectstatic double 30b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#endif 31b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projecttwo54 = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */ 32b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 33b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#ifdef __STDC__ 34b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double ieee_frexp(double x, int *eptr) 35b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#else 36b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double ieee_frexp(x, eptr) 37b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double x; int *eptr; 38b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#endif 39b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project{ 40b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project int hx, ix, lx; 41b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project hx = __HI(x); 42b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project ix = 0x7fffffff&hx; 43b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project lx = __LO(x); 44b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *eptr = 0; 45b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project if(ix>=0x7ff00000||((ix|lx)==0)) return x; /* 0,inf,nan */ 46b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project if (ix<0x00100000) { /* subnormal */ 47b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project x *= two54; 48b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project hx = __HI(x); 49b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project ix = hx&0x7fffffff; 50b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *eptr = -54; 51b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project } 52b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project *eptr += (ix>>20)-1022; 53b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project hx = (hx&0x800fffff)|0x3fe00000; 54b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project __HI(x) = hx; 55b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project return x; 56b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project} 57