xref: /netbsd-src/lib/libc/gen/fpclassifyf_ieee754.c (revision ce099b40997c43048fb78bd578195f81d2456523)
1*ce099b40Smartin /*	$NetBSD: fpclassifyf_ieee754.c,v 1.3 2008/04/28 20:22:59 martin Exp $	*/
275327729Skleink 
375327729Skleink /*-
475327729Skleink  * Copyright (c) 2003 The NetBSD Foundation, Inc.
575327729Skleink  * All rights reserved.
675327729Skleink  *
775327729Skleink  * This code is derived from software contributed to The NetBSD Foundation
875327729Skleink  * by Klaus Klein.
975327729Skleink  *
1075327729Skleink  * Redistribution and use in source and binary forms, with or without
1175327729Skleink  * modification, are permitted provided that the following conditions
1275327729Skleink  * are met:
1375327729Skleink  * 1. Redistributions of source code must retain the above copyright
1475327729Skleink  *    notice, this list of conditions and the following disclaimer.
1575327729Skleink  * 2. Redistributions in binary form must reproduce the above copyright
1675327729Skleink  *    notice, this list of conditions and the following disclaimer in the
1775327729Skleink  *    documentation and/or other materials provided with the distribution.
1875327729Skleink  *
1975327729Skleink  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2075327729Skleink  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2175327729Skleink  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2275327729Skleink  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2375327729Skleink  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2475327729Skleink  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2575327729Skleink  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2675327729Skleink  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2775327729Skleink  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2875327729Skleink  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2975327729Skleink  * POSSIBILITY OF SUCH DAMAGE.
3075327729Skleink  */
3175327729Skleink 
3275327729Skleink #include <sys/cdefs.h>
3375327729Skleink #if defined(LIBC_SCCS) && !defined(lint)
34*ce099b40Smartin __RCSID("$NetBSD: fpclassifyf_ieee754.c,v 1.3 2008/04/28 20:22:59 martin Exp $");
3575327729Skleink #endif
3675327729Skleink 
3775327729Skleink #include <machine/ieee.h>
3875327729Skleink #include <math.h>
3975327729Skleink 
4075327729Skleink /*
4175327729Skleink  * 7.12.3.1 fpclassify - classify real floating type
4275327729Skleink  *          IEEE 754 single-precision version
4375327729Skleink  */
4475327729Skleink int
__fpclassifyf(float x)4575327729Skleink __fpclassifyf(float x)
4675327729Skleink {
4775327729Skleink 	union ieee_single_u u;
4875327729Skleink 
4975327729Skleink 	u.sngu_f = x;
5075327729Skleink 
5175327729Skleink 	if (u.sngu_sng.sng_exp == 0) {
5275327729Skleink 		if (u.sngu_sng.sng_frac == 0)
5375327729Skleink 			return FP_ZERO;
5475327729Skleink 		else
5575327729Skleink 			return FP_SUBNORMAL;
563991bf60Skleink 	} else if (u.sngu_sng.sng_exp == SNG_EXP_INFNAN) {
5775327729Skleink 		if (u.sngu_sng.sng_frac == 0)
5875327729Skleink 			return FP_INFINITE;
5975327729Skleink 		else
6075327729Skleink 			return FP_NAN;
6175327729Skleink 	}
6275327729Skleink 
6375327729Skleink 	return FP_NORMAL;
6475327729Skleink }
65