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