xref: /openbsd-src/lib/libc/gen/isfinite.c (revision 38ffb6671a42c58f11058f1570756a541cabcd23)
1*38ffb667Sespie /*	$OpenBSD: isfinite.c,v 1.8 2013/07/03 04:46:36 espie Exp $	*/
2610deaf9Smartynas /*
3610deaf9Smartynas  * Copyright (c) 2008 Martynas Venckus <martynas@openbsd.org>
4610deaf9Smartynas  *
5610deaf9Smartynas  * Permission to use, copy, modify, and distribute this software for any
6610deaf9Smartynas  * purpose with or without fee is hereby granted, provided that the above
7610deaf9Smartynas  * copyright notice and this permission notice appear in all copies.
8610deaf9Smartynas  *
9610deaf9Smartynas  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10610deaf9Smartynas  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11610deaf9Smartynas  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12610deaf9Smartynas  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13610deaf9Smartynas  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14610deaf9Smartynas  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15610deaf9Smartynas  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16610deaf9Smartynas  */
17610deaf9Smartynas 
18610deaf9Smartynas #include <sys/types.h>
19610deaf9Smartynas #include <machine/ieee.h>
204914100aSmartynas #include <float.h>
214914100aSmartynas #include <math.h>
22610deaf9Smartynas 
23610deaf9Smartynas int
__isfinite(double d)24610deaf9Smartynas __isfinite(double d)
25610deaf9Smartynas {
26610deaf9Smartynas 	struct ieee_double *p = (struct ieee_double *)&d;
27610deaf9Smartynas 
28610deaf9Smartynas 	return (p->dbl_exp != DBL_EXP_INFNAN);
29610deaf9Smartynas }
30610deaf9Smartynas 
31610deaf9Smartynas int
__isfinitef(float f)32610deaf9Smartynas __isfinitef(float f)
33610deaf9Smartynas {
34610deaf9Smartynas 	struct ieee_single *p = (struct ieee_single *)&f;
35610deaf9Smartynas 
36610deaf9Smartynas 	return (p->sng_exp != SNG_EXP_INFNAN);
37610deaf9Smartynas }
384914100aSmartynas 
39*38ffb667Sespie #if	LDBL_MANT_DIG == DBL_MANT_DIG
402fbf033eSmartynas __strong_alias(__isfinitel, __isfinite);
41*38ffb667Sespie #endif	/* LDBL_MANT_DIG == DBL_MANT_DIG */
424914100aSmartynas 
434914100aSmartynas /*
444914100aSmartynas  * 3BSD compatibility aliases.
454914100aSmartynas  */
462fbf033eSmartynas __strong_alias(finite, __isfinite);
472fbf033eSmartynas __strong_alias(finitef, __isfinitef);
48