xref: /relibc/openlibm/src/s_fpclassify.c (revision 00e0e7e5ee49b7bf85f235b7020c19339469eb13)
1 /*-
2  * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  */
27 
28 #include <openlibm.h>
29 
30 #include "fpmath.h"
31 
32 int
33 __fpclassifyd(double d)
34 {
35 	union IEEEd2bits u;
36 
37 	u.d = d;
38 	if (u.bits.exp == 2047) {
39 		if (u.bits.manl == 0 && u.bits.manh == 0) {
40 			return FP_INFINITE;
41 		} else {
42 			return FP_NAN;
43 		}
44 	} else if (u.bits.exp != 0) {
45 		return FP_NORMAL;
46 	} else if (u.bits.manl == 0 && u.bits.manh == 0) {
47 		return FP_ZERO;
48 	} else {
49 		return FP_SUBNORMAL;
50 	}
51 }
52 
53 
54 int
55 __fpclassifyf(float f)
56 {
57 	union IEEEf2bits u;
58 
59 	u.f = f;
60 	if (u.bits.exp == 255) {
61 	   if (u.bits.man == 0) {
62 		   return FP_INFINITE;
63 	   } else {
64 		   return FP_NAN;
65 	   }
66 	} else if (u.bits.exp != 0) {
67 		return FP_NORMAL;
68 	} else if (u.bits.man == 0) {
69 		return FP_ZERO;
70 	} else {
71 		return FP_SUBNORMAL;
72 	}
73 }
74 
75 int
76 __fpclassifyl(long double e)
77 {
78 	union IEEEl2bits u;
79 
80 	u.e = e;
81 	mask_nbit_l(u);
82 	if (u.bits.exp == 32767) {
83 		if (u.bits.manl == 0 && u.bits.manh == 0) {
84 			return FP_INFINITE;
85 		} else {
86 			return FP_NAN;
87 		}
88 	} else if (u.bits.exp != 0) {
89 		return FP_NORMAL;
90 	} else if (u.bits.manl == 0 && u.bits.manh == 0) {
91 		return FP_ZERO;
92 	} else {
93 		return FP_SUBNORMAL;
94 	}
95 }
96 
97 
98