infinityl_ieee754.c revision 1.1 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