fpclassify.c revision 110566
1185743Ssam/*-
2185743Ssam * Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org>
3185743Ssam * Copyright (c) 2002, 2003 David Schultz <dschultz@uclink.Berkeley.EDU>
4185743Ssam * All rights reserved.
5185743Ssam *
6185743Ssam * Redistribution and use in source and binary forms, with or without
7185743Ssam * modification, are permitted provided that the following conditions
8185743Ssam * are met:
9187322Ssam * 1. Redistributions of source code must retain the above copyright
10187322Ssam *    notice, this list of conditions and the following disclaimer.
11189098Ssam * 2. Redistributions in binary form must reproduce the above copyright
12187322Ssam *    notice, this list of conditions and the following disclaimer in the
13187322Ssam *    documentation and/or other materials provided with the distribution.
14217681Sadrian *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 * $FreeBSD: head/lib/libc/gen/fpclassify.c 110566 2003-02-08 20:37:55Z mike $
28 */
29
30#include <sys/endian.h>
31
32#include <math.h>
33#include <stdint.h>
34
35#include "fpmath.h"
36
37int
38__fpclassifyf(float f)
39{
40	union IEEEf2bits u;
41
42	u.f = f;
43	if (u.bits.exp == 0) {
44		if (u.bits.man == 0)
45			return (FP_ZERO);
46		return (FP_SUBNORMAL);
47	}
48	if (u.bits.exp == 255) {
49		if (u.bits.man == 0)
50			return (FP_INFINITE);
51		return (FP_NAN);
52	}
53	return (FP_NORMAL);
54}
55
56int
57__fpclassifyd(double d)
58{
59	union IEEEd2bits u;
60
61	u.d = d;
62	if (u.bits.exp == 0) {
63		if ((u.bits.manl | u.bits.manh) == 0)
64			return (FP_ZERO);
65		return (FP_SUBNORMAL);
66	}
67	if (u.bits.exp == 2047) {
68		if ((u.bits.manl | u.bits.manh) == 0)
69			return (FP_INFINITE);
70		return (FP_NAN);
71	}
72	return (FP_NORMAL);
73}
74
75int
76__fpclassifyl(long double e)
77{
78	union IEEEl2bits u;
79
80	u.e = e;
81	if (u.bits.exp == 0) {
82		if ((u.bits.manl | u.bits.manh) == 0)
83			return (FP_ZERO);
84		return (FP_SUBNORMAL);
85	}
86	mask_nbit_l(u);		/* Mask normalization bit if applicable. */
87	if (u.bits.exp == 32767) {
88		if ((u.bits.manl | u.bits.manh) == 0)
89			return (FP_INFINITE);
90		return (FP_NAN);
91	}
92	return (FP_NORMAL);
93}
94