float.h revision 1.22
1/*	$NetBSD: float.h,v 1.22 2023/12/31 04:20:40 dholland Exp $	*/
2
3#ifndef _M68K_FLOAT_H_
4#define _M68K_FLOAT_H_
5
6/*
7 * LDBL_MIN is half the x86 LDBL_MIN, even though both are 12-byte
8 * floats with the same base properties and both allegedly
9 * IEEE-compliant, because both these representations materialize the
10 * top (integer-part) bit of the mantissa. But on m68k if the exponent
11 * is 0 and the integer bit is set, it's a regular number, whereas on
12 * x86 it's called a pseudo-denormal and apparently treated as a
13 * denormal, so it doesn't count as a valid value for LDBL_MIN.
14 *
15 * x86 citation: Intel 64 and IA-32 Architectures Software Developer's
16 * Manual, vol. 1 (Order Number: 253665-077US, April 2022), Sec. 8.2.2
17 * `Unsupported Double Extended-Precision Floating-Point Encodings
18 * and Pseudo-Denormals', p. 8-14.
19 *
20 * m86k citation: MC68881/MC68882 Floating-Point Coprocessor User's
21 * Manual, Second Edition (Prentice-Hall, 1989, apparently issued by
22 * Freescale), Section 3.2 `Binary Real Data formats', pg. 3-3 bottom
23 * in particular and pp. 3-2 to 3-5 in general.
24 *
25 * If anyone needs to update this comment please make sure the copy in
26 * m68k/float.h also gets updated.
27 */
28
29#if defined(__LDBL_MANT_DIG__)
30#define LDBL_MANT_DIG	__LDBL_MANT_DIG__
31#define LDBL_EPSILON	__LDBL_EPSILON__
32#define LDBL_DIG	__LDBL_DIG__
33#define LDBL_MIN_EXP	__LDBL_MIN_EXP__
34#define LDBL_MIN	__LDBL_MIN__
35#define LDBL_MIN_10_EXP	__LDBL_MIN_10_EXP__
36#define LDBL_MAX_EXP	__LDBL_MAX_EXP__
37#define LDBL_MAX	__LDBL_MAX__
38#define LDBL_MAX_10_EXP	__LDBL_MAX_10_EXP__
39#elif !defined(__mc68010__) && !defined(__mcoldfire__)
40#define LDBL_MANT_DIG	64
41#define LDBL_EPSILON	1.0842021724855044340E-19L
42#define LDBL_DIG	18
43#define LDBL_MIN_EXP	(-16381)
44#define LDBL_MIN	1.6810515715560467531E-4932L
45#define LDBL_MIN_10_EXP	(-4931)
46#define LDBL_MAX_EXP	16384
47#define LDBL_MAX	1.1897314953572317650E+4932L
48#define LDBL_MAX_10_EXP	4932
49#endif
50
51#include <sys/float_ieee754.h>
52
53#if !defined(__mc68010__) && !defined(__mcoldfire__)
54#if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) && \
55    !defined(_XOPEN_SOURCE) || \
56    ((__STDC_VERSION__ - 0) >= 199901L) || \
57    ((_POSIX_C_SOURCE - 0) >= 200112L) || \
58    ((_XOPEN_SOURCE  - 0) >= 600) || \
59    defined(_ISOC99_SOURCE) || defined(_NETBSD_SOURCE)
60#define	DECIMAL_DIG	21
61#endif /* !defined(_ANSI_SOURCE) && ... */
62#endif /* !__mc68010__ && !__mcoldfire__ */
63
64#endif	/* !_M68K_FLOAT_H_ */
65