1/*
2 * Copyright (c) 1988, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the University nor the names of its contributors
14 *    may be used to endorse or promote products derived from this software
15 *    without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 *	@(#)mathimpl.h	8.1 (Berkeley) 6/4/93
30 */
31
32#include <sys/cdefs.h>
33#include <math.h>
34
35#if defined(vax)||defined(tahoe)
36
37/* Deal with different ways to concatenate in cpp */
38#  ifdef __STDC__
39#    define	cat3(a,b,c) a ## b ## c
40#  else
41#    define	cat3(a,b,c) a/**/b/**/c
42#  endif
43
44/* Deal with vax/tahoe byte order issues */
45#  ifdef vax
46#    define	cat3t(a,b,c) cat3(a,b,c)
47#  else
48#    define	cat3t(a,b,c) cat3(a,c,b)
49#  endif
50
51#  define vccast(name) (*(const double *)(cat3(name,,x)))
52
53   /*
54    * Define a constant to high precision on a Vax or Tahoe.
55    *
56    * Args are the name to define, the decimal floating point value,
57    * four 16-bit chunks of the float value in hex
58    * (because the vax and tahoe differ in float format!), the power
59    * of 2 of the hex-float exponent, and the hex-float mantissa.
60    * Most of these arguments are not used at compile time; they are
61    * used in a post-check to make sure the constants were compiled
62    * correctly.
63    *
64    * People who want to use the constant will have to do their own
65    *     #define foo vccast(foo)
66    * since CPP cannot do this for them from inside another macro (sigh).
67    * We define "vccast" if this needs doing.
68    */
69#  define vc(name, value, x1,x2,x3,x4, bexp, xval) \
70	const static long cat3(name,,x)[] = {cat3t(0x,x1,x2), cat3t(0x,x3,x4)};
71
72#  define ic(name, value, bexp, xval) ;
73
74#else	/* vax or tahoe */
75
76   /* Hooray, we have an IEEE machine */
77#  undef vccast
78#  define vc(name, value, x1,x2,x3,x4, bexp, xval) ;
79
80#  define ic(name, value, bexp, xval) \
81	const static double name = value;
82
83#endif	/* defined(vax)||defined(tahoe) */
84
85
86/*
87 * Functions internal to the math package, yet not static.
88 */
89extern double	__exp__E();
90extern double	__log__L();
91
92struct Double {double a, b;};
93double __exp__D __P((double, double));
94struct Double __log__D __P((double));
95
96/*
97 * All externs exported after this point
98 */
99#if defined(_BLD_ast) && defined(__EXPORT__)
100#define extern	__EXPORT__
101#endif
102
103extern double	copysign(double, double);
104