Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
with
152 additions
and 3 deletions.
- +1 −1 CMakeLists.txt
- +1 −0 VisualC/SDL/SDL.vcxproj
- +1 −0 VisualC/SDL/SDL.vcxproj.filters
- +1 −1 configure
- +1 −1 configure.in
- +2 −0 include/SDL_config.h.cmake
- +2 −0 include/SDL_config.h.in
- +2 −0 include/SDL_config_android.h
- +2 −0 include/SDL_config_iphoneos.h
- +2 −0 include/SDL_config_macosx.h
- +1 −0 include/SDL_config_pandora.h
- +2 −0 include/SDL_config_psp.h
- +2 −0 include/SDL_config_windows.h
- +2 −0 include/SDL_config_winrt.h
- +2 −0 include/SDL_config_wiz.h
- +106 −0 src/libm/e_log10.c
- +1 −0 src/libm/math_libm.h
- +1 −0 src/libm/math_private.h
- +20 −0 src/stdlib/SDL_stdlib.c
@@ -0,0 +1,106 @@ | ||
/* | ||
* ==================================================== | ||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. | ||
* | ||
* Developed at SunPro, a Sun Microsystems, Inc. business. | ||
* Permission to use, copy, modify, and distribute this | ||
* software is freely granted, provided that this notice | ||
* is preserved. | ||
* ==================================================== | ||
*/ | ||
|
||
#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ | ||
/* C4723: potential divide by zero. */ | ||
#pragma warning ( disable : 4723 ) | ||
#endif | ||
|
||
/* __ieee754_log10(x) | ||
* Return the base 10 logarithm of x | ||
* | ||
* Method : | ||
* Let log10_2hi = leading 40 bits of log10(2) and | ||
* log10_2lo = log10(2) - log10_2hi, | ||
* ivln10 = 1/log(10) rounded. | ||
* Then | ||
* n = ilogb(x), | ||
* if(n<0) n = n+1; | ||
* x = scalbn(x,-n); | ||
* log10(x) := n*log10_2hi + (n*log10_2lo + ivln10*log(x)) | ||
* | ||
* Note 1: | ||
* To guarantee log10(10**n)=n, where 10**n is normal, the rounding | ||
* mode must set to Round-to-Nearest. | ||
* Note 2: | ||
* [1/log(10)] rounded to 53 bits has error .198 ulps; | ||
* log10 is monotonic at all binary break points. | ||
* | ||
* Special cases: | ||
* log10(x) is NaN with signal if x < 0; | ||
* log10(+INF) is +INF with no signal; log10(0) is -INF with signal; | ||
* log10(NaN) is that NaN with no signal; | ||
* log10(10**N) = N for N=0,1,...,22. | ||
* | ||
* Constants: | ||
* The hexadecimal values are the intended ones for the following constants. | ||
* The decimal values may be used, provided that the compiler will convert | ||
* from decimal to binary accurately enough to produce the hexadecimal values | ||
* shown. | ||
*/ | ||
|
||
#include "math_libm.h" | ||
#include "math_private.h" | ||
|
||
static const double | ||
two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */ | ||
ivln10 = 4.34294481903251816668e-01, /* 0x3FDBCB7B, 0x1526E50E */ | ||
log10_2hi = 3.01029995663611771306e-01, /* 0x3FD34413, 0x509F6000 */ | ||
log10_2lo = 3.69423907715893078616e-13; /* 0x3D59FEF3, 0x11F12B36 */ | ||
|
||
static const double zero = 0.0; | ||
|
||
double attribute_hidden __ieee754_log10(double x) | ||
{ | ||
double y,z; | ||
int32_t i,k,hx; | ||
u_int32_t lx; | ||
|
||
EXTRACT_WORDS(hx,lx,x); | ||
|
||
k=0; | ||
if (hx < 0x00100000) { /* x < 2**-1022 */ | ||
if (((hx&0x7fffffff)|lx)==0) | ||
return -two54/zero; /* log(+-0)=-inf */ | ||
if (hx<0) return (x-x)/zero; /* log(-#) = NaN */ | ||
k -= 54; x *= two54; /* subnormal number, scale up x */ | ||
GET_HIGH_WORD(hx,x); | ||
} | ||
if (hx >= 0x7ff00000) return x+x; | ||
k += (hx>>20)-1023; | ||
i = ((u_int32_t)k&0x80000000)>>31; | ||
hx = (hx&0x000fffff)|((0x3ff-i)<<20); | ||
y = (double)(k+i); | ||
SET_HIGH_WORD(x,hx); | ||
z = y*log10_2lo + ivln10*__ieee754_log(x); | ||
return z+y*log10_2hi; | ||
} | ||
|
||
/* | ||
* wrapper log10(X) | ||
*/ | ||
#ifndef _IEEE_LIBM | ||
double log10(double x) | ||
{ | ||
double z = __ieee754_log10(x); | ||
if (_LIB_VERSION == _IEEE_ || isnan(x)) | ||
return z; | ||
if (x <= 0.0) { | ||
if(x == 0.0) | ||
return __kernel_standard(x, x, 18); /* log10(0) */ | ||
return __kernel_standard(x, x, 19); /* log10(x<0) */ | ||
} | ||
return z; | ||
} | ||
#else | ||
strong_alias(__ieee754_log10, log10) | ||
#endif | ||
libm_hidden_def(log10) |