1 1.1 matt /* $NetBSD: infinityl_ieee754.c,v 1.1 2011/01/17 23:53:03 matt Exp $ */ 2 1.1 matt 3 1.1 matt /* 4 1.1 matt * IEEE-compatible infinityl.c for 64-bit or 128-bit long double format. 5 1.1 matt * This is public domain. 6 1.1 matt */ 7 1.1 matt 8 1.1 matt #include <sys/cdefs.h> 9 1.1 matt #if defined(LIBC_SCCS) && !defined(lint) 10 1.1 matt __RCSID("$NetBSD: infinityl_ieee754.c,v 1.1 2011/01/17 23:53:03 matt Exp $"); 11 1.1 matt #endif /* LIBC_SCCS and not lint */ 12 1.1 matt 13 1.1 matt #include <math.h> 14 1.1 matt #include <machine/endian.h> 15 1.1 matt #include <machine/ieee.h> 16 1.1 matt 17 1.1 matt #ifdef __HAVE_LONG_DOUBLE 18 1.1 matt #define LDBL_EXPBITS EXT_EXPBITS 19 1.1 matt #define LDBL_EXP_INFNAN EXT_EXP_INFNAN 20 1.1 matt #else 21 1.1 matt #define LDBL_EXPBITS DBL_EXPBITS 22 1.1 matt #define LDBL_EXP_INFNAN DBL_EXP_INFNAN 23 1.1 matt #endif 24 1.1 matt 25 1.1 matt #define EXP_INFNAN (LDBL_EXP_INFNAN << (31 - LDBL_EXPBITS)) 26 1.1 matt 27 1.1 matt const union __long_double_u __infinityl = { { 28 1.1 matt #if BYTE_ORDER == BIG_ENDIAN 29 1.1 matt [0] = (EXP_INFNAN >> 24) & 0x7f, 30 1.1 matt [1] = (EXP_INFNAN >> 16) & 0xff, 31 1.1 matt [2] = (EXP_INFNAN >> 8) & 0xff, 32 1.1 matt [3] = (EXP_INFNAN >> 0) & 0xff, 33 1.1 matt #else 34 1.1 matt [sizeof(long double)-4] = (EXP_INFNAN >> 0) & 0xff, 35 1.1 matt [sizeof(long double)-3] = (EXP_INFNAN >> 8) & 0xff, 36 1.1 matt [sizeof(long double)-2] = (EXP_INFNAN >> 16) & 0xff, 37 1.1 matt [sizeof(long double)-1] = (EXP_INFNAN >> 24) & 0x7f, 38 1.1 matt #endif 39 1.1 matt } }; 40