t2ex/bsd_source/lib/libc/src_bsd/math/fpclassify.c | bare source | permlink (0.01 seconds) |
1: /* $OpenBSD: fpclassify.c,v 1.5 2011/05/30 17:28:15 martynas Exp $ */ 2: /* 3: * Copyright (c) 2008 Martynas Venckus <martynas@openbsd.org> 4: * 5: * Permission to use, copy, modify, and distribute this software for any 6: * purpose with or without fee is hereby granted, provided that the above 7: * copyright notice and this permission notice appear in all copies. 8: * 9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16: */ 17: 18: /* LINTLIBRARY */ 19: 20: #include <sys/types.h> 21: #include <sys/cdefs.h> 22: #include <machine/ieee.h> 23: #include <float.h> 24: #include <math.h> 25: 26: int 27: __fpclassify(double d) 28: { 29: struct ieee_double *p = (struct ieee_double *)&d; 30: 31: if (p->dbl_exp == 0) { 32: if (p->dbl_frach == 0 && p->dbl_fracl == 0) 33: return FP_ZERO; 34: else 35: return FP_SUBNORMAL; 36: } 37: 38: if (p->dbl_exp == DBL_EXP_INFNAN) { 39: if (p->dbl_frach == 0 && p->dbl_fracl == 0) 40: return FP_INFINITE; 41: else 42: return FP_NAN; 43: } 44: 45: return FP_NORMAL; 46: } 47: 48: int 49: __fpclassifyf(float f) 50: { 51: struct ieee_single *p = (struct ieee_single *)&f; 52: 53: if (p->sng_exp == 0) { 54: if (p->sng_frac == 0) 55: return FP_ZERO; 56: else 57: return FP_SUBNORMAL; 58: } 59: 60: if (p->sng_exp == SNG_EXP_INFNAN) { 61: if (p->sng_frac == 0) 62: return FP_INFINITE; 63: else 64: return FP_NAN; 65: } 66: 67: return FP_NORMAL; 68: } 69: 70: #if LDBL_MANT_DIG == 53 71: #ifdef lint 72: /* PROTOLIB1 */ 73: int __fpclassifyl(long double); 74: #else /* lint */ 75: __weak_alias(__fpclassifyl, __fpclassify); 76: #endif /* lint */ 77: #endif /* LDBL_MANT_DIG == 53 */