139bcea86SDavid Schultz /*-
2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
3d915a14eSPedro F. Giffuni *
439bcea86SDavid Schultz * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
539bcea86SDavid Schultz * All rights reserved.
639bcea86SDavid Schultz *
739bcea86SDavid Schultz * Redistribution and use in source and binary forms, with or without
839bcea86SDavid Schultz * modification, are permitted provided that the following conditions
939bcea86SDavid Schultz * are met:
1039bcea86SDavid Schultz * 1. Redistributions of source code must retain the above copyright
1139bcea86SDavid Schultz * notice, this list of conditions and the following disclaimer.
1239bcea86SDavid Schultz * 2. Redistributions in binary form must reproduce the above copyright
1339bcea86SDavid Schultz * notice, this list of conditions and the following disclaimer in the
1439bcea86SDavid Schultz * documentation and/or other materials provided with the distribution.
1539bcea86SDavid Schultz *
1639bcea86SDavid Schultz * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1739bcea86SDavid Schultz * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1839bcea86SDavid Schultz * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1939bcea86SDavid Schultz * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2039bcea86SDavid Schultz * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2139bcea86SDavid Schultz * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2239bcea86SDavid Schultz * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2339bcea86SDavid Schultz * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2439bcea86SDavid Schultz * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2539bcea86SDavid Schultz * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2639bcea86SDavid Schultz * SUCH DAMAGE.
2739bcea86SDavid Schultz */
2839bcea86SDavid Schultz
2939bcea86SDavid Schultz #include <math.h>
3039bcea86SDavid Schultz
3139bcea86SDavid Schultz #include "fpmath.h"
3239bcea86SDavid Schultz
3339bcea86SDavid Schultz double
frexp(double d,int * ex)3439bcea86SDavid Schultz frexp(double d, int *ex)
3539bcea86SDavid Schultz {
3639bcea86SDavid Schultz union IEEEd2bits u;
3739bcea86SDavid Schultz
3839bcea86SDavid Schultz u.d = d;
3939bcea86SDavid Schultz switch (u.bits.exp) {
4039bcea86SDavid Schultz case 0: /* 0 or subnormal */
4139bcea86SDavid Schultz if ((u.bits.manl | u.bits.manh) == 0) {
4239bcea86SDavid Schultz *ex = 0;
4339bcea86SDavid Schultz } else {
4439bcea86SDavid Schultz u.d *= 0x1.0p514;
4539bcea86SDavid Schultz *ex = u.bits.exp - 1536;
4639bcea86SDavid Schultz u.bits.exp = 1022;
4739bcea86SDavid Schultz }
4839bcea86SDavid Schultz break;
4939bcea86SDavid Schultz case 2047: /* infinity or NaN; value of *ex is unspecified */
5039bcea86SDavid Schultz break;
5139bcea86SDavid Schultz default: /* normal */
5239bcea86SDavid Schultz *ex = u.bits.exp - 1022;
5339bcea86SDavid Schultz u.bits.exp = 1022;
5439bcea86SDavid Schultz break;
5539bcea86SDavid Schultz }
5639bcea86SDavid Schultz return (u.d);
5739bcea86SDavid Schultz }
58