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