xref: /original-bsd/lib/libc/hp300/gen/frexp.c (revision 325d3b5e)
15463dc25Sbostic /*-
2*325d3b5eSbostic  * Copyright (c) 1991, 1993
3*325d3b5eSbostic  *	The Regents of the University of California.  All rights reserved.
45463dc25Sbostic  *
55463dc25Sbostic  * %sccs.include.redist.c%
65463dc25Sbostic  */
75463dc25Sbostic 
85463dc25Sbostic #if defined(LIBC_SCCS) && !defined(lint)
9*325d3b5eSbostic static char sccsid[] = "@(#)frexp.c	8.1 (Berkeley) 06/04/93";
105463dc25Sbostic #endif /* LIBC_SCCS and not lint */
115463dc25Sbostic 
125463dc25Sbostic #include <sys/types.h>
135463dc25Sbostic #include <math.h>
145463dc25Sbostic 
155463dc25Sbostic double
frexp(value,eptr)165463dc25Sbostic frexp(value, eptr)
175463dc25Sbostic 	double value;
185463dc25Sbostic 	int *eptr;
195463dc25Sbostic {
205463dc25Sbostic 	union {
215463dc25Sbostic                 double v;
225463dc25Sbostic                 struct {
235463dc25Sbostic                         u_int  u_sign :  1;
245463dc25Sbostic 			u_int   u_exp : 11;
255463dc25Sbostic 			u_int u_mant1 : 20;
265463dc25Sbostic 			u_int u_mant2 : 32;
275463dc25Sbostic                 } s;
285463dc25Sbostic         } u;
295463dc25Sbostic 
305463dc25Sbostic 	if (value) {
315463dc25Sbostic 		u.v = value;
325463dc25Sbostic 		*eptr = u.s.u_exp - 1022;
335463dc25Sbostic 		u.s.u_exp = 1022;
345463dc25Sbostic 		return(u.v);
355463dc25Sbostic 	} else {
365463dc25Sbostic 		*eptr = 0;
375463dc25Sbostic 		return((double)0);
385463dc25Sbostic 	}
395463dc25Sbostic }
40