#ifdef __APPLE_CC__
#if __APPLE_CC__ > 930
#include "fp_private.h"
#include "fenv_private.h"
#define LOGORITHMIC_NAN "36"
static const double ln2 = 6.931471805599452862e-1;
static const double ln2Tail = 2.319046813846299558e-17;
static const double log10e = 4.342944819032518200e-01; static const double log10eTail = 1.098319650216765200e-17; static const double log2e = 1.4426950408889634e+0; static const double log2eTail = 2.0355273740931033e-17; static const double twoTo128 = 3.402823669209384635e+38;
static const double largestDenorm = 2.2250738585072009e-308; static const hexdouble infinity = HEXDOUBLE(0x7ff00000, 0x00000000);
static const double c2 = -0.5000000000000000042725;
static const double c3 = 0.3333333333296328456505;
static const double c4 = -0.2499999999949632195759;
static const double c5 = 0.2000014541571685319141;
static const double c6 = -0.1666681511199968257150;
static const double d2 = -0.5000000000000000000000; static const double d3 = 0.3333333333333360968212; static const double d4 = -0.2500000000000056849516; static const double d5 = 0.1999999996377879912068; static const double d6 = -0.1666666662009609743117; static const double d7 = 0.1428690115662276259345; static const double d8 = -0.1250122079043555957999;
extern const unsigned long int logTable[];
struct logTableEntry
{
double X;
double G;
hexdouble F;
};
#if !defined(BUILDING_FOR_CARBONCORE_LEGACY)
double log ( double x )
{
hexdouble yInHex, xInHex, OldEnvironment;
register double n, zTail, high, low, z, z2, temp1, temp2, temp3, result;
register long int i;
unsigned long int xhead;
struct logTableEntry *tablePointer = ( struct logTableEntry * ) logTable;
xInHex.d = x;
fegetenvd( OldEnvironment.d );
fesetenvd( 0.0 );
xhead = xInHex.i.hi;
if ( xhead < 0x7ff00000 )
{ if ( xhead >= 0x000fffff )
{ i = xInHex.i.hi & 0x000fffff;
yInHex.i.lo = xInHex.i.lo;
yInHex.i.hi = i | 0x3ff00000; if ( yInHex.i.hi & 0x00080000 )
{ n = (long) ( xInHex.i.hi >> 20 ) - 1022;
i = ( i >> 13 ) & 0x3f; yInHex.d *= 0.5;
}
else
{ n = (long) ( xInHex.i.hi >> 20 ) - 1023;
i = ( i >> 12 ) + 64; }
}
else if ( x != 0.0 )
{ xInHex.d = x * twoTo128;
i = xInHex.i.hi & 0x000fffff;
yInHex.i.lo = xInHex.i.lo;
yInHex.i.hi = i | 0x3ff00000; if ( yInHex.i.hi & 0x00080000 )
{ n = (long) ( xInHex.i.hi >> 20 ) - 1150.0;
i = ( i >> 13 ) & 0x3f; yInHex.d *= 0.5;
}
else
{ n = (long) ( xInHex.i.hi >> 20 ) - 1151;
i = ( i >> 12 ) + 64; }
}
else {
OldEnvironment.i.lo |= FE_DIVBYZERO;
result = -infinity.d;
fesetenvd( OldEnvironment.d );
return result;
}
z = ( yInHex.d - tablePointer[i].X ) * tablePointer[i].G;
zTail = ( ( yInHex.d - tablePointer[i].X ) - z * tablePointer[i].X ) * tablePointer[i].G;
z2 = z * z;
if ( n == 0.0 )
{ if ( x == 1.0 )
{
fesetenvd( OldEnvironment.d );
return +0.0;
}
temp1 = d8 * z2 + d6;
temp2 = d7 * z2 + d5;
temp1 = temp1 * z2 + d4;
temp2 = temp2 * z2 + d3;
OldEnvironment.i.lo |= FE_INEXACT; temp1 = temp1 * z + temp2;
temp2 = temp1 * z + d2;
temp3 = z + tablePointer[i].F.d;
low = tablePointer[i].F.d - temp3 + z + ( zTail - z * zTail );
result = temp2 * z2 + low;
result += temp3;
fesetenvd( OldEnvironment.d );
return result;
}
else if ( tablePointer[i].F.i.hi != 0 )
{ low = n * ln2Tail + zTail;
high = z + tablePointer[i].F.d;
zTail = tablePointer[i].F.d - high + z;
OldEnvironment.i.lo |= FE_INEXACT; temp1 = n * ln2 + low;
low = ( n * ln2 - temp1 ) + low;
temp3 = c6 * z2 + c4;
temp2 = c5 * z2 + c3;
temp3 = temp3 * z2;
temp2 = ( temp2 * z + temp3 ) + c2;
temp3 = high + temp1;
temp1 = ( temp1 - temp3 ) + high;
result = ( ( temp2 * z2 + low ) + temp1 ) + zTail;
result += temp3;
fesetenvd( OldEnvironment.d );
return result;
}
else
{ low = n * ln2Tail + zTail;
temp3 = n * ln2 + low;
low = ( n * ln2 - temp3 ) + low;
OldEnvironment.i.lo |= FE_INEXACT; temp1 = d8 * z2 + d6;
temp2 = d7 * z2 + d5;
temp1 = temp1 * z2 + d4;
temp2 = temp2 * z2 + d3;
temp1 = temp1 * z + temp2;
temp2 = temp1 * z + d2;
result = ( temp2 * z2 + low ) + z;
result += temp3;
fesetenvd( OldEnvironment.d );
return result;
}
}
if ( x == 0.0 )
{
OldEnvironment.i.lo |= FE_DIVBYZERO;
x = -infinity.d;
}
else if ( x < 0.0 )
{ OldEnvironment.i.lo |= SET_INVALID;
x = nan ( LOGORITHMIC_NAN );
}
fesetenvd( OldEnvironment.d );
return x;
}
#ifdef notdef
float logf ( float x )
{
return (float)log( x );
}
#endif
double log10 ( double x )
{
hexdouble yInHex, xInHex, OldEnvironment;
register double n, zTail, high, low, z, z2, temp1, temp2, temp3, result, resultLow;
register long int i;
unsigned long int xhead;
struct logTableEntry *tablePointer = ( struct logTableEntry * ) logTable;
xInHex.d = x;
fegetenvd( OldEnvironment.d );
fesetenvd( 0.0 );
xhead = xInHex.i.hi;
if ( xhead < 0x7ff00000 )
{ if ( xhead >= 0x000fffff )
{ i = xInHex.i.hi & 0x000fffff;
yInHex.i.lo = xInHex.i.lo;
yInHex.i.hi = i | 0x3ff00000; if ( yInHex.i.hi & 0x00080000 )
{ n = (long) ( xInHex.i.hi >> 20 ) - 1022;
i = ( i >> 13 ) & 0x3f; yInHex.d *= 0.5;
}
else
{ n = (long) ( xInHex.i.hi >> 20 ) - 1023;
i = ( i >> 12 ) + 64; }
}
else if ( x != 0.0 )
{ xInHex.d = x * twoTo128;
i = xInHex.i.hi & 0x000fffff;
yInHex.i.lo = xInHex.i.lo;
yInHex.i.hi = i | 0x3ff00000; if ( yInHex.i.hi & 0x00080000 )
{ n = (long) ( xInHex.i.hi >> 20 ) - 1150;
i = ( i >> 13 ) & 0x3f; yInHex.d *= 0.5;
}
else
{ n = (long) ( xInHex.i.hi >> 20 ) - 1151;
i = ( i >> 12 ) + 64; }
}
else
{
OldEnvironment.i.lo |= FE_DIVBYZERO;
result = -infinity.d;
fesetenvd( OldEnvironment.d );
return result;
}
z = ( yInHex.d - tablePointer[i].X ) * tablePointer[i].G;
zTail = ( ( yInHex.d - tablePointer[i].X ) - z * tablePointer[i].X ) * tablePointer[i].G;
z2 = z * z;
if ( n == 0.0 )
{ if ( x == 1.0 )
{
fesetenvd( OldEnvironment.d );
return +0.0;
}
temp1 = d8 * z2 + d6;
temp2 = d7 * z2 + d5;
temp1 = temp1 * z2 + d4;
temp2 = temp2 * z2 + d3;
OldEnvironment.i.lo |= FE_INEXACT; temp1 = temp1 * z + temp2;
temp2 = temp1 * z + d2;
temp3 = z + tablePointer[i].F.d;
low = tablePointer[i].F.d - temp3 + z + ( zTail - z * zTail );
result = ( temp2 * z2 + low ) + temp3;
resultLow = temp3 - result + ( temp2 * z2 + low );
resultLow = resultLow * log10e + result * log10eTail;
result = ( resultLow + result * log10e );
fesetenvd( OldEnvironment.d );
return result;
}
else if ( tablePointer[i].F.i.hi != 0 )
{
low = n * ln2Tail + zTail;
high = z + tablePointer[i].F.d;
zTail = tablePointer[i].F.d - high + z;
OldEnvironment.i.lo |= FE_INEXACT; temp1 = n * ln2 + low;
low = ( n* ln2 - temp1 ) + low;
temp3 = c6 * z2 + c4;
temp2 = c5 * z2 + c3;
temp3 = temp3 * z2;
temp2 = ( temp2 * z + temp3 ) + c2;
temp3 = high + temp1;
temp1 = ( temp1 - temp3 ) + high;
result = ( ( ( temp2 * z2 + low ) + temp1 ) + zTail ) + temp3;
resultLow = temp3 - result + zTail + temp1 + ( temp2 * z2 + low );
resultLow = resultLow * log10e + result * log10eTail;
result = ( resultLow + result * log10e );
fesetenvd( OldEnvironment.d );
return result;
}
else
{
low = n * ln2Tail + zTail;
temp3 = n * ln2 + low;
low = ( n * ln2 - temp3 ) + low;
OldEnvironment.i.lo |= FE_INEXACT; temp1 = d8 * z2 + d6;
temp2 = d7 * z2 + d5;
temp1 = temp1 * z2 + d4;
temp2 = temp2 * z2 + d3;
temp1 = temp1 * z + temp2;
temp2 = temp1 * z + d2;
result = ( ( temp2 * z2 + low ) + z ) + temp3;
resultLow = temp3 - result + z + ( temp2 * z2 + low );
resultLow = resultLow * log10e + result * log10eTail;
result = ( resultLow + result * log10e );
fesetenvd( OldEnvironment.d );
return result;
}
}
if ( x == 0.0 )
{
OldEnvironment.i.lo |= FE_DIVBYZERO;
x = -infinity.d;
}
else if ( x < 0.0 )
{ OldEnvironment.i.lo |= SET_INVALID;
x = nan ( LOGORITHMIC_NAN );
}
fesetenvd( OldEnvironment.d );
return x;
}
#ifdef notdef
float log10f ( float x )
{
return (float)log10( x );
}
#endif
double log1p ( double x )
{
hexdouble yInHex, xInHex, OldEnvironment;
register double yLow, n, zTail, high, low, z, z2, temp1, temp2, temp3, result;
register long int i;
struct logTableEntry *tablePointer = ( struct logTableEntry * ) logTable;
fegetenvd( OldEnvironment.d );
fesetenvd( 0.0 );
if ( ( x > -1.0 ) && ( x < infinity.d ) )
{
yInHex.d = 1.0 + x; yLow = ( x < 1.0 ) ? ( 1.0 - yInHex.d ) + x : ( x - yInHex.d ) + 1.0;
i = yInHex.i.hi & 0x000fffff;
n = (long) ( yInHex.i.hi >> 20 ) - 1023;
xInHex.i.lo = 0x0;
xInHex.i.hi = 0x7fe00000 - ( yInHex.i.hi & 0x7ff00000 );
yLow *= xInHex.d;
yInHex.i.hi = i | 0x3ff00000; if ( yInHex.i.hi & 0x00080000 )
{ n += 1.0;
yInHex.d *= 0.5;
yLow *= 0.5;
i = ( i >> 13 ) & 0x3f; }
else
{ i = ( i >> 12 ) + 64; }
z = ( yInHex.d - tablePointer[i].X ) * tablePointer[i].G;
zTail = ( ( yInHex.d - tablePointer[i].X ) - z * tablePointer[i].X + yLow ) * tablePointer[i].G;
z2 = z * z;
if ( n == 0.0 )
{
if ( yInHex.d == 1.0 )
{
if ( x != 0.0 )
{
if ( __fabs( x ) <= largestDenorm )
OldEnvironment.i.lo |= FE_UNDERFLOW | FE_INEXACT; else
OldEnvironment.i.lo |= FE_INEXACT; }
fesetenvd( OldEnvironment.d );
return x;
}
temp1 = d8 * z2 + d6;
temp2 = d7 * z2 + d5;
temp1 = temp1 * z2 + d4;
temp2 = temp2 * z2 + d3;
temp1 = temp1 * z + temp2;
temp2 = temp1 * z + d2;
temp3 = z + tablePointer[i].F.d;
low = tablePointer[i].F.d - temp3 + z + ( zTail - z * zTail );
result = temp2 * z2 + low;
}
else if ( tablePointer[i].F.i.hi != 0 )
{
low = n * ln2Tail + zTail;
high = z + tablePointer[i].F.d;
zTail = tablePointer[i].F.d - high + z;
temp1 = n * ln2 + low;
low = ( n * ln2 - temp1 ) + low;
temp3 = c6 * z2 + c4;
temp2 = c5 * z2 + c3;
temp3 = temp3 * z2;
temp2 = ( temp2 * z + temp3 ) + c2;
temp3 = high + temp1;
temp1 = ( temp1 - temp3 ) + high;
result = ( ( temp2 * z2 + low ) + temp1 ) + zTail;
}
else
{
low = n * ln2Tail + zTail;
temp3 = n * ln2 + low;
low = ( n * ln2 - temp3 ) + low + yLow;
temp1 = d8 * z2 + d6;
temp2 = d7 * z2 + d5;
temp1 = temp1 * z2 + d4;
temp2 = temp2 * z2 + d3;
temp1 = temp1 * z + temp2;
temp2 = temp1 * z + d2;
result = ( temp2 * z2 + low ) + z;
}
OldEnvironment.i.lo |= FE_INEXACT; result += temp3;
fesetenvd( OldEnvironment.d );
return result;
}
if ( x == -1.0 )
{
OldEnvironment.i.lo |= FE_DIVBYZERO;
x = -infinity.d;
}
else if ( x < -1.0 )
{ OldEnvironment.i.lo |= SET_INVALID;
x = nan ( LOGORITHMIC_NAN );
}
fesetenvd( OldEnvironment.d );
return x;
}
#ifdef notdef
float log1pf ( float x )
{
return (float)log1p( x );
}
#endif
#else
double log2 ( double x )
{
hexdouble yInHex, xInHex, OldEnvironment;
register double n, zTail, low, z, z2, temp1, temp2, temp3, result;
register long int i;
unsigned long int xhead;
struct logTableEntry *tablePointer = ( struct logTableEntry * ) logTable;
xInHex.d = x;
fegetenvd( OldEnvironment.d );
fesetenvd( 0.0 );
xhead = xInHex.i.hi;
if ( xhead < 0x7ff00000 )
{ if ( xhead >= 0x000fffff )
{ i = xInHex.i.hi & 0x000fffff;
yInHex.i.lo = xInHex.i.lo;
yInHex.i.hi = i | 0x3ff00000; if ( yInHex.i.hi & 0x00080000 )
{ n = (long) ( xInHex.i.hi >> 20 ) - 1022;
i = ( i >> 13 ) & 0x3f; yInHex.d *= 0.5;
}
else
{ n = (long) ( xInHex.i.hi >> 20 ) - 1023;
i = ( i >> 12 ) + 64; }
}
else if ( x != 0.0 )
{ xInHex.d = x * twoTo128;
i = xInHex.i.hi & 0x000fffff;
yInHex.i.lo = xInHex.i.lo;
yInHex.i.hi = i | 0x3ff00000; if ( yInHex.i.hi & 0x00080000 )
{ n = (long) ( xInHex.i.hi >> 20 ) - 1150;
i = ( i >> 13 ) & 0x3f; yInHex.d *= 0.5;
}
else
{ n = (long) ( xInHex.i.hi >> 20 ) - 1151;
i = ( i >> 12 ) + 64; }
}
else {
OldEnvironment.i.lo |= FE_DIVBYZERO;
result = -infinity.d;
fesetenvd( OldEnvironment.d );
return result;
}
z = ( yInHex.d - tablePointer[i].X ) * tablePointer[i].G;
zTail = ( ( yInHex.d - tablePointer[i].X ) - z * tablePointer[i].X ) * tablePointer[i].G;
if ( yInHex.d != 1.0 )
OldEnvironment.i.lo |= FE_INEXACT; z2 = z * z;
temp1 = d8 * z2 + d6;
temp2 = d7 * z2 + d5;
temp1 = temp1 * z2 + d4;
temp2 = temp2 * z2 + d3;
temp1 = temp1 * z + temp2;
temp2 = temp1 * z + d2;
temp3 = z + tablePointer[i].F.d;
low = tablePointer[i].F.d - temp3 + z + ( zTail - z * zTail );
temp1 = ( temp2 * z2 + low ) + temp3;
temp2 = temp3 - temp1 + ( temp2 * z2 + low );
temp3 = temp2 * log2e + temp1 * log2eTail;
if ( n == 0.0 )
{
result = temp3 + temp1 * log2e;
fesetenvd( OldEnvironment.d );
return result;
}
else
{ result = n + temp1 * log2e;
temp3 = ( ( n - result ) + temp1 * log2e ) + temp3;
result += temp3;
fesetenvd( OldEnvironment.d );
return result;
}
}
if ( x == 0.0 )
{
OldEnvironment.i.lo |= FE_DIVBYZERO;
x = -infinity.d;
}
else if ( x < 0.0 )
{ OldEnvironment.i.lo |= SET_INVALID;
x = nan ( LOGORITHMIC_NAN );
}
fesetenvd( OldEnvironment.d );
return x;
}
#ifdef notdef
float log2f ( float x )
{
return (float)log2( x );
}
#endif
#endif
#else
#warning A higher version than gcc-932 is required.
#endif
#endif