Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
09984229
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
09984229
编写于
8月 06, 2011
作者:
D
darcy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
7075098: Remove unused fdlibm files
Reviewed-by: alanb, mduigou
上级
1de3ffb3
变更
21
隐藏空白更改
内联
并排
Showing
21 changed file
with
1 addition
and
2787 deletion
+1
-2787
make/java/fdlibm/FILES_c.gmk
make/java/fdlibm/FILES_c.gmk
+0
-18
src/share/native/java/lang/fdlibm/include/fdlibm.h
src/share/native/java/lang/fdlibm/include/fdlibm.h
+1
-33
src/share/native/java/lang/fdlibm/include/jfdlibm.h
src/share/native/java/lang/fdlibm/include/jfdlibm.h
+0
-11
src/share/native/java/lang/fdlibm/src/e_acosh.c
src/share/native/java/lang/fdlibm/src/e_acosh.c
+0
-77
src/share/native/java/lang/fdlibm/src/e_gamma.c
src/share/native/java/lang/fdlibm/src/e_gamma.c
+0
-45
src/share/native/java/lang/fdlibm/src/e_gamma_r.c
src/share/native/java/lang/fdlibm/src/e_gamma_r.c
+0
-44
src/share/native/java/lang/fdlibm/src/e_j0.c
src/share/native/java/lang/fdlibm/src/e_j0.c
+0
-491
src/share/native/java/lang/fdlibm/src/e_j1.c
src/share/native/java/lang/fdlibm/src/e_j1.c
+0
-490
src/share/native/java/lang/fdlibm/src/e_jn.c
src/share/native/java/lang/fdlibm/src/e_jn.c
+0
-285
src/share/native/java/lang/fdlibm/src/e_lgamma.c
src/share/native/java/lang/fdlibm/src/e_lgamma.c
+0
-45
src/share/native/java/lang/fdlibm/src/e_lgamma_r.c
src/share/native/java/lang/fdlibm/src/e_lgamma_r.c
+0
-316
src/share/native/java/lang/fdlibm/src/s_asinh.c
src/share/native/java/lang/fdlibm/src/s_asinh.c
+0
-74
src/share/native/java/lang/fdlibm/src/s_erf.c
src/share/native/java/lang/fdlibm/src/s_erf.c
+0
-323
src/share/native/java/lang/fdlibm/src/w_acosh.c
src/share/native/java/lang/fdlibm/src/w_acosh.c
+0
-51
src/share/native/java/lang/fdlibm/src/w_gamma.c
src/share/native/java/lang/fdlibm/src/w_gamma.c
+0
-58
src/share/native/java/lang/fdlibm/src/w_gamma_r.c
src/share/native/java/lang/fdlibm/src/w_gamma_r.c
+0
-55
src/share/native/java/lang/fdlibm/src/w_j0.c
src/share/native/java/lang/fdlibm/src/w_j0.c
+0
-78
src/share/native/java/lang/fdlibm/src/w_j1.c
src/share/native/java/lang/fdlibm/src/w_j1.c
+0
-79
src/share/native/java/lang/fdlibm/src/w_jn.c
src/share/native/java/lang/fdlibm/src/w_jn.c
+0
-101
src/share/native/java/lang/fdlibm/src/w_lgamma.c
src/share/native/java/lang/fdlibm/src/w_lgamma.c
+0
-58
src/share/native/java/lang/fdlibm/src/w_lgamma_r.c
src/share/native/java/lang/fdlibm/src/w_lgamma_r.c
+0
-55
未找到文件。
make/java/fdlibm/FILES_c.gmk
浏览文件 @
09984229
...
...
@@ -30,21 +30,13 @@ FILES_c = \
k_sin.c \
k_tan.c \
e_acos.c \
e_acosh.c \
e_asin.c \
e_atan2.c \
e_atanh.c \
e_cosh.c \
e_exp.c \
e_fmod.c \
e_gamma.c \
e_gamma_r.c \
e_hypot.c \
e_j0.c \
e_j1.c \
e_jn.c \
e_lgamma.c \
e_lgamma_r.c \
e_log.c \
e_log10.c \
e_pow.c \
...
...
@@ -54,21 +46,13 @@ FILES_c = \
e_sinh.c \
e_sqrt.c \
w_acos.c \
w_acosh.c \
w_asin.c \
w_atan2.c \
w_atanh.c \
w_cosh.c \
w_exp.c \
w_fmod.c \
w_gamma.c \
w_gamma_r.c \
w_hypot.c \
w_j0.c \
w_j1.c \
w_jn.c \
w_lgamma.c \
w_lgamma_r.c \
w_log.c \
w_log10.c \
w_pow.c \
...
...
@@ -76,13 +60,11 @@ FILES_c = \
w_scalb.c \
w_sinh.c \
w_sqrt.c \
s_asinh.c \
s_atan.c \
s_cbrt.c \
s_ceil.c \
s_copysign.c \
s_cos.c \
s_erf.c \
s_expm1.c \
s_fabs.c \
s_finite.c \
...
...
src/share/native/java/lang/fdlibm/include/fdlibm.h
浏览文件 @
09984229
...
...
@@ -135,22 +135,10 @@ extern double fabs __P((double));
extern
double
floor
__P
((
double
));
extern
double
fmod
__P
((
double
,
double
));
extern
double
erf
__P
((
double
));
extern
double
erfc
__P
((
double
));
extern
double
gamma
__P
((
double
));
extern
double
hypot
__P
((
double
,
double
));
extern
int
isnan
__P
((
double
));
extern
int
finite
__P
((
double
));
extern
double
j0
__P
((
double
));
extern
double
j1
__P
((
double
));
extern
double
jn
__P
((
int
,
double
));
extern
double
lgamma
__P
((
double
));
extern
double
y0
__P
((
double
));
extern
double
y1
__P
((
double
));
extern
double
yn
__P
((
int
,
double
));
extern
double
acosh
__P
((
double
));
extern
double
asinh
__P
((
double
));
extern
double
atanh
__P
((
double
));
extern
double
cbrt
__P
((
double
));
extern
double
logb
__P
((
double
));
...
...
@@ -183,19 +171,9 @@ extern double scalbn __P((double, int));
extern
double
expm1
__P
((
double
));
extern
double
log1p
__P
((
double
));
/*
* Reentrant version of gamma & lgamma; passes signgam back by reference
* as the second argument; user must allocate space for signgam.
*/
#ifdef _REENTRANT
extern
double
gamma_r
__P
((
double
,
int
*
));
extern
double
lgamma_r
__P
((
double
,
int
*
));
#endif
/* _REENTRANT */
/* ieee style elementary functions */
extern
double
__ieee754_sqrt
__P
((
double
));
extern
double
__ieee754_acos
__P
((
double
));
extern
double
__ieee754_acosh
__P
((
double
));
extern
double
__ieee754_log
__P
((
double
));
extern
double
__ieee754_atanh
__P
((
double
));
extern
double
__ieee754_asin
__P
((
double
));
...
...
@@ -204,19 +182,9 @@ extern double __ieee754_exp __P((double));
extern
double
__ieee754_cosh
__P
((
double
));
extern
double
__ieee754_fmod
__P
((
double
,
double
));
extern
double
__ieee754_pow
__P
((
double
,
double
));
extern
double
__ieee754_lgamma_r
__P
((
double
,
int
*
));
extern
double
__ieee754_gamma_r
__P
((
double
,
int
*
));
extern
double
__ieee754_lgamma
__P
((
double
));
extern
double
__ieee754_gamma
__P
((
double
));
extern
double
__ieee754_log10
__P
((
double
));
extern
double
__ieee754_sinh
__P
((
double
));
extern
double
__ieee754_hypot
__P
((
double
,
double
));
extern
double
__ieee754_j0
__P
((
double
));
extern
double
__ieee754_j1
__P
((
double
));
extern
double
__ieee754_y0
__P
((
double
));
extern
double
__ieee754_y1
__P
((
double
));
extern
double
__ieee754_jn
__P
((
int
,
double
));
extern
double
__ieee754_yn
__P
((
int
,
double
));
extern
double
__ieee754_remainder
__P
((
double
,
double
));
extern
int
__ieee754_rem_pio2
__P
((
double
,
double
*
));
#ifdef _SCALB_INT
...
...
src/share/native/java/lang/fdlibm/include/jfdlibm.h
浏览文件 @
09984229
...
...
@@ -64,7 +64,6 @@
#ifdef __linux__
#define __ieee754_sqrt __j__ieee754_sqrt
#define __ieee754_acos __j__ieee754_acos
#define __ieee754_acosh __j__ieee754_acosh
#define __ieee754_log __j__ieee754_log
#define __ieee754_atanh __j__ieee754_atanh
#define __ieee754_asin __j__ieee754_asin
...
...
@@ -73,19 +72,9 @@
#define __ieee754_cosh __j__ieee754_cosh
#define __ieee754_fmod __j__ieee754_fmod
#define __ieee754_pow __j__ieee754_pow
#define __ieee754_lgamma_r __j__ieee754_lgamma_r
#define __ieee754_gamma_r __j__ieee754_gamma_r
#define __ieee754_lgamma __j__ieee754_lgamma
#define __ieee754_gamma __j__ieee754_gamma
#define __ieee754_log10 __j__ieee754_log10
#define __ieee754_sinh __j__ieee754_sinh
#define __ieee754_hypot __j__ieee754_hypot
#define __ieee754_j0 __j__ieee754_j0
#define __ieee754_j1 __j__ieee754_j1
#define __ieee754_y0 __j__ieee754_y0
#define __ieee754_y1 __j__ieee754_y1
#define __ieee754_jn __j__ieee754_jn
#define __ieee754_yn __j__ieee754_yn
#define __ieee754_remainder __j__ieee754_remainder
#define __ieee754_rem_pio2 __j__ieee754_rem_pio2
#define __ieee754_scalb __j__ieee754_scalb
...
...
src/share/native/java/lang/fdlibm/src/e_acosh.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* __ieee754_acosh(x)
* Method :
* Based on
* acosh(x) = log [ x + sqrt(x*x-1) ]
* we have
* acosh(x) := log(x)+ln2, if x is large; else
* acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else
* acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
*
* Special cases:
* acosh(x) is NaN with signal if x<1.
* acosh(NaN) is NaN without signal.
*/
#include "fdlibm.h"
#ifdef __STDC__
static
const
double
#else
static
double
#endif
one
=
1
.
0
,
ln2
=
6.93147180559945286227e-01
;
/* 0x3FE62E42, 0xFEFA39EF */
#ifdef __STDC__
double
__ieee754_acosh
(
double
x
)
#else
double
__ieee754_acosh
(
x
)
double
x
;
#endif
{
double
t
;
int
hx
;
hx
=
__HI
(
x
);
if
(
hx
<
0x3ff00000
)
{
/* x < 1 */
return
(
x
-
x
)
/
(
x
-
x
);
}
else
if
(
hx
>=
0x41b00000
)
{
/* x > 2**28 */
if
(
hx
>=
0x7ff00000
)
{
/* x is inf of NaN */
return
x
+
x
;
}
else
return
__ieee754_log
(
x
)
+
ln2
;
/* acosh(huge)=log(2x) */
}
else
if
(((
hx
-
0x3ff00000
)
|
__LO
(
x
))
==
0
)
{
return
0
.
0
;
/* acosh(1) = 0 */
}
else
if
(
hx
>
0x40000000
)
{
/* 2**28 > x > 2 */
t
=
x
*
x
;
return
__ieee754_log
(
2
.
0
*
x
-
one
/
(
x
+
sqrt
(
t
-
one
)));
}
else
{
/* 1<x<2 */
t
=
x
-
one
;
return
log1p
(
t
+
sqrt
(
2
.
0
*
t
+
t
*
t
));
}
}
src/share/native/java/lang/fdlibm/src/e_gamma.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* __ieee754_gamma(x)
* Return the logarithm of the Gamma function of x.
*
* Method: call __ieee754_gamma_r
*/
#include "fdlibm.h"
extern
int
signgam
;
#ifdef __STDC__
double
__ieee754_gamma
(
double
x
)
#else
double
__ieee754_gamma
(
x
)
double
x
;
#endif
{
return
__ieee754_gamma_r
(
x
,
&
signgam
);
}
src/share/native/java/lang/fdlibm/src/e_gamma_r.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* __ieee754_gamma_r(x, signgamp)
* Reentrant version of the logarithm of the Gamma function
* with user provide pointer for the sign of Gamma(x).
*
* Method: See __ieee754_lgamma_r
*/
#include "fdlibm.h"
#ifdef __STDC__
double
__ieee754_gamma_r
(
double
x
,
int
*
signgamp
)
#else
double
__ieee754_gamma_r
(
x
,
signgamp
)
double
x
;
int
*
signgamp
;
#endif
{
return
__ieee754_lgamma_r
(
x
,
signgamp
);
}
src/share/native/java/lang/fdlibm/src/e_j0.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* __ieee754_j0(x), __ieee754_y0(x)
* Bessel function of the first and second kinds of order zero.
* Method -- j0(x):
* 1. For tiny x, we use j0(x) = 1 - x^2/4 + x^4/64 - ...
* 2. Reduce x to |x| since j0(x)=j0(-x), and
* for x in (0,2)
* j0(x) = 1-z/4+ z^2*R0/S0, where z = x*x;
* (precision: |j0-1+z/4-z^2R0/S0 |<2**-63.67 )
* for x in (2,inf)
* j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0))
* where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
* as follow:
* cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
* = 1/sqrt(2) * (cos(x) + sin(x))
* sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4)
* = 1/sqrt(2) * (sin(x) - cos(x))
* (To avoid cancellation, use
* sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
* to compute the worse one.)
*
* 3 Special cases
* j0(nan)= nan
* j0(0) = 1
* j0(inf) = 0
*
* Method -- y0(x):
* 1. For x<2.
* Since
* y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x^2/4 - ...)
* therefore y0(x)-2/pi*j0(x)*ln(x) is an even function.
* We use the following function to approximate y0,
* y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x^2
* where
* U(z) = u00 + u01*z + ... + u06*z^6
* V(z) = 1 + v01*z + ... + v04*z^4
* with absolute approximation error bounded by 2**-72.
* Note: For tiny x, U/V = u0 and j0(x)~1, hence
* y0(tiny) = u0 + (2/pi)*ln(tiny), (choose tiny<2**-27)
* 2. For x>=2.
* y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0))
* where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
* by the method mentioned above.
* 3. Special cases: y0(0)=-inf, y0(x<0)=NaN, y0(inf)=0.
*/
#include "fdlibm.h"
#ifdef __STDC__
static
double
pzero
(
double
),
qzero
(
double
);
#else
static
double
pzero
(),
qzero
();
#endif
#ifdef __STDC__
static
const
double
#else
static
double
#endif
huge
=
1e300
,
one
=
1
.
0
,
invsqrtpi
=
5.64189583547756279280e-01
,
/* 0x3FE20DD7, 0x50429B6D */
tpi
=
6.36619772367581382433e-01
,
/* 0x3FE45F30, 0x6DC9C883 */
/* R0/S0 on [0, 2.00] */
R02
=
1.56249999999999947958e-02
,
/* 0x3F8FFFFF, 0xFFFFFFFD */
R03
=
-
1.89979294238854721751e-04
,
/* 0xBF28E6A5, 0xB61AC6E9 */
R04
=
1.82954049532700665670e-06
,
/* 0x3EBEB1D1, 0x0C503919 */
R05
=
-
4.61832688532103189199e-09
,
/* 0xBE33D5E7, 0x73D63FCE */
S01
=
1.56191029464890010492e-02
,
/* 0x3F8FFCE8, 0x82C8C2A4 */
S02
=
1.16926784663337450260e-04
,
/* 0x3F1EA6D2, 0xDD57DBF4 */
S03
=
5.13546550207318111446e-07
,
/* 0x3EA13B54, 0xCE84D5A9 */
S04
=
1.16614003333790000205e-09
;
/* 0x3E1408BC, 0xF4745D8F */
static
double
zero
=
0
.
0
;
#ifdef __STDC__
double
__ieee754_j0
(
double
x
)
#else
double
__ieee754_j0
(
x
)
double
x
;
#endif
{
double
z
,
s
,
c
,
ss
,
cc
,
r
,
u
,
v
;
int
hx
,
ix
;
hx
=
__HI
(
x
);
ix
=
hx
&
0x7fffffff
;
if
(
ix
>=
0x7ff00000
)
return
one
/
(
x
*
x
);
x
=
fabs
(
x
);
if
(
ix
>=
0x40000000
)
{
/* |x| >= 2.0 */
s
=
sin
(
x
);
c
=
cos
(
x
);
ss
=
s
-
c
;
cc
=
s
+
c
;
if
(
ix
<
0x7fe00000
)
{
/* make sure x+x not overflow */
z
=
-
cos
(
x
+
x
);
if
((
s
*
c
)
<
zero
)
cc
=
z
/
ss
;
else
ss
=
z
/
cc
;
}
/*
* j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
* y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
*/
if
(
ix
>
0x48000000
)
z
=
(
invsqrtpi
*
cc
)
/
sqrt
(
x
);
else
{
u
=
pzero
(
x
);
v
=
qzero
(
x
);
z
=
invsqrtpi
*
(
u
*
cc
-
v
*
ss
)
/
sqrt
(
x
);
}
return
z
;
}
if
(
ix
<
0x3f200000
)
{
/* |x| < 2**-13 */
if
(
huge
+
x
>
one
)
{
/* raise inexact if x != 0 */
if
(
ix
<
0x3e400000
)
return
one
;
/* |x|<2**-27 */
else
return
one
-
0
.
25
*
x
*
x
;
}
}
z
=
x
*
x
;
r
=
z
*
(
R02
+
z
*
(
R03
+
z
*
(
R04
+
z
*
R05
)));
s
=
one
+
z
*
(
S01
+
z
*
(
S02
+
z
*
(
S03
+
z
*
S04
)));
if
(
ix
<
0x3FF00000
)
{
/* |x| < 1.00 */
return
one
+
z
*
(
-
0
.
25
+
(
r
/
s
));
}
else
{
u
=
0
.
5
*
x
;
return
((
one
+
u
)
*
(
one
-
u
)
+
z
*
(
r
/
s
));
}
}
#ifdef __STDC__
static
const
double
#else
static
double
#endif
u00
=
-
7.38042951086872317523e-02
,
/* 0xBFB2E4D6, 0x99CBD01F */
u01
=
1.76666452509181115538e-01
,
/* 0x3FC69D01, 0x9DE9E3FC */
u02
=
-
1.38185671945596898896e-02
,
/* 0xBF8C4CE8, 0xB16CFA97 */
u03
=
3.47453432093683650238e-04
,
/* 0x3F36C54D, 0x20B29B6B */
u04
=
-
3.81407053724364161125e-06
,
/* 0xBECFFEA7, 0x73D25CAD */
u05
=
1.95590137035022920206e-08
,
/* 0x3E550057, 0x3B4EABD4 */
u06
=
-
3.98205194132103398453e-11
,
/* 0xBDC5E43D, 0x693FB3C8 */
v01
=
1.27304834834123699328e-02
,
/* 0x3F8A1270, 0x91C9C71A */
v02
=
7.60068627350353253702e-05
,
/* 0x3F13ECBB, 0xF578C6C1 */
v03
=
2.59150851840457805467e-07
,
/* 0x3E91642D, 0x7FF202FD */
v04
=
4.41110311332675467403e-10
;
/* 0x3DFE5018, 0x3BD6D9EF */
#ifdef __STDC__
double
__ieee754_y0
(
double
x
)
#else
double
__ieee754_y0
(
x
)
double
x
;
#endif
{
double
z
,
s
,
c
,
ss
,
cc
,
u
,
v
;
int
hx
,
ix
,
lx
;
hx
=
__HI
(
x
);
ix
=
0x7fffffff
&
hx
;
lx
=
__LO
(
x
);
/* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0 */
if
(
ix
>=
0x7ff00000
)
return
one
/
(
x
+
x
*
x
);
if
((
ix
|
lx
)
==
0
)
return
-
one
/
zero
;
if
(
hx
<
0
)
return
zero
/
zero
;
if
(
ix
>=
0x40000000
)
{
/* |x| >= 2.0 */
/* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
* where x0 = x-pi/4
* Better formula:
* cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
* = 1/sqrt(2) * (sin(x) + cos(x))
* sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
* = 1/sqrt(2) * (sin(x) - cos(x))
* To avoid cancellation, use
* sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
* to compute the worse one.
*/
s
=
sin
(
x
);
c
=
cos
(
x
);
ss
=
s
-
c
;
cc
=
s
+
c
;
/*
* j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
* y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
*/
if
(
ix
<
0x7fe00000
)
{
/* make sure x+x not overflow */
z
=
-
cos
(
x
+
x
);
if
((
s
*
c
)
<
zero
)
cc
=
z
/
ss
;
else
ss
=
z
/
cc
;
}
if
(
ix
>
0x48000000
)
z
=
(
invsqrtpi
*
ss
)
/
sqrt
(
x
);
else
{
u
=
pzero
(
x
);
v
=
qzero
(
x
);
z
=
invsqrtpi
*
(
u
*
ss
+
v
*
cc
)
/
sqrt
(
x
);
}
return
z
;
}
if
(
ix
<=
0x3e400000
)
{
/* x < 2**-27 */
return
(
u00
+
tpi
*
__ieee754_log
(
x
));
}
z
=
x
*
x
;
u
=
u00
+
z
*
(
u01
+
z
*
(
u02
+
z
*
(
u03
+
z
*
(
u04
+
z
*
(
u05
+
z
*
u06
)))));
v
=
one
+
z
*
(
v01
+
z
*
(
v02
+
z
*
(
v03
+
z
*
v04
)));
return
(
u
/
v
+
tpi
*
(
__ieee754_j0
(
x
)
*
__ieee754_log
(
x
)));
}
/* The asymptotic expansions of pzero is
* 1 - 9/128 s^2 + 11025/98304 s^4 - ..., where s = 1/x.
* For x >= 2, We approximate pzero by
* pzero(x) = 1 + (R/S)
* where R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10
* S = 1 + pS0*s^2 + ... + pS4*s^10
* and
* | pzero(x)-1-R/S | <= 2 ** ( -60.26)
*/
#ifdef __STDC__
static
const
double
pR8
[
6
]
=
{
/* for x in [inf, 8]=1/[0,0.125] */
#else
static
double
pR8
[
6
]
=
{
/* for x in [inf, 8]=1/[0,0.125] */
#endif
0.00000000000000000000e+00
,
/* 0x00000000, 0x00000000 */
-
7.03124999999900357484e-02
,
/* 0xBFB1FFFF, 0xFFFFFD32 */
-
8.08167041275349795626e+00
,
/* 0xC02029D0, 0xB44FA779 */
-
2.57063105679704847262e+02
,
/* 0xC0701102, 0x7B19E863 */
-
2.48521641009428822144e+03
,
/* 0xC0A36A6E, 0xCD4DCAFC */
-
5.25304380490729545272e+03
,
/* 0xC0B4850B, 0x36CC643D */
};
#ifdef __STDC__
static
const
double
pS8
[
5
]
=
{
#else
static
double
pS8
[
5
]
=
{
#endif
1.16534364619668181717e+02
,
/* 0x405D2233, 0x07A96751 */
3.83374475364121826715e+03
,
/* 0x40ADF37D, 0x50596938 */
4.05978572648472545552e+04
,
/* 0x40E3D2BB, 0x6EB6B05F */
1.16752972564375915681e+05
,
/* 0x40FC810F, 0x8F9FA9BD */
4.76277284146730962675e+04
,
/* 0x40E74177, 0x4F2C49DC */
};
#ifdef __STDC__
static
const
double
pR5
[
6
]
=
{
/* for x in [8,4.5454]=1/[0.125,0.22001] */
#else
static
double
pR5
[
6
]
=
{
/* for x in [8,4.5454]=1/[0.125,0.22001] */
#endif
-
1.14125464691894502584e-11
,
/* 0xBDA918B1, 0x47E495CC */
-
7.03124940873599280078e-02
,
/* 0xBFB1FFFF, 0xE69AFBC6 */
-
4.15961064470587782438e+00
,
/* 0xC010A370, 0xF90C6BBF */
-
6.76747652265167261021e+01
,
/* 0xC050EB2F, 0x5A7D1783 */
-
3.31231299649172967747e+02
,
/* 0xC074B3B3, 0x6742CC63 */
-
3.46433388365604912451e+02
,
/* 0xC075A6EF, 0x28A38BD7 */
};
#ifdef __STDC__
static
const
double
pS5
[
5
]
=
{
#else
static
double
pS5
[
5
]
=
{
#endif
6.07539382692300335975e+01
,
/* 0x404E6081, 0x0C98C5DE */
1.05125230595704579173e+03
,
/* 0x40906D02, 0x5C7E2864 */
5.97897094333855784498e+03
,
/* 0x40B75AF8, 0x8FBE1D60 */
9.62544514357774460223e+03
,
/* 0x40C2CCB8, 0xFA76FA38 */
2.40605815922939109441e+03
,
/* 0x40A2CC1D, 0xC70BE864 */
};
#ifdef __STDC__
static
const
double
pR3
[
6
]
=
{
/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
#else
static
double
pR3
[
6
]
=
{
/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
#endif
-
2.54704601771951915620e-09
,
/* 0xBE25E103, 0x6FE1AA86 */
-
7.03119616381481654654e-02
,
/* 0xBFB1FFF6, 0xF7C0E24B */
-
2.40903221549529611423e+00
,
/* 0xC00345B2, 0xAEA48074 */
-
2.19659774734883086467e+01
,
/* 0xC035F74A, 0x4CB94E14 */
-
5.80791704701737572236e+01
,
/* 0xC04D0A22, 0x420A1A45 */
-
3.14479470594888503854e+01
,
/* 0xC03F72AC, 0xA892D80F */
};
#ifdef __STDC__
static
const
double
pS3
[
5
]
=
{
#else
static
double
pS3
[
5
]
=
{
#endif
3.58560338055209726349e+01
,
/* 0x4041ED92, 0x84077DD3 */
3.61513983050303863820e+02
,
/* 0x40769839, 0x464A7C0E */
1.19360783792111533330e+03
,
/* 0x4092A66E, 0x6D1061D6 */
1.12799679856907414432e+03
,
/* 0x40919FFC, 0xB8C39B7E */
1.73580930813335754692e+02
,
/* 0x4065B296, 0xFC379081 */
};
#ifdef __STDC__
static
const
double
pR2
[
6
]
=
{
/* for x in [2.8570,2]=1/[0.3499,0.5] */
#else
static
double
pR2
[
6
]
=
{
/* for x in [2.8570,2]=1/[0.3499,0.5] */
#endif
-
8.87534333032526411254e-08
,
/* 0xBE77D316, 0xE927026D */
-
7.03030995483624743247e-02
,
/* 0xBFB1FF62, 0x495E1E42 */
-
1.45073846780952986357e+00
,
/* 0xBFF73639, 0x8A24A843 */
-
7.63569613823527770791e+00
,
/* 0xC01E8AF3, 0xEDAFA7F3 */
-
1.11931668860356747786e+01
,
/* 0xC02662E6, 0xC5246303 */
-
3.23364579351335335033e+00
,
/* 0xC009DE81, 0xAF8FE70F */
};
#ifdef __STDC__
static
const
double
pS2
[
5
]
=
{
#else
static
double
pS2
[
5
]
=
{
#endif
2.22202997532088808441e+01
,
/* 0x40363865, 0x908B5959 */
1.36206794218215208048e+02
,
/* 0x4061069E, 0x0EE8878F */
2.70470278658083486789e+02
,
/* 0x4070E786, 0x42EA079B */
1.53875394208320329881e+02
,
/* 0x40633C03, 0x3AB6FAFF */
1.46576176948256193810e+01
,
/* 0x402D50B3, 0x44391809 */
};
#ifdef __STDC__
static
double
pzero
(
double
x
)
#else
static
double
pzero
(
x
)
double
x
;
#endif
{
#ifdef __STDC__
const
double
*
p
=
(
void
*
)
0
,
*
q
=
(
void
*
)
0
;
#else
double
*
p
,
*
q
;
#endif
double
z
,
r
,
s
;
int
ix
;
ix
=
0x7fffffff
&
__HI
(
x
);
if
(
ix
>=
0x40200000
)
{
p
=
pR8
;
q
=
pS8
;}
else
if
(
ix
>=
0x40122E8B
){
p
=
pR5
;
q
=
pS5
;}
else
if
(
ix
>=
0x4006DB6D
){
p
=
pR3
;
q
=
pS3
;}
else
if
(
ix
>=
0x40000000
){
p
=
pR2
;
q
=
pS2
;}
z
=
one
/
(
x
*
x
);
r
=
p
[
0
]
+
z
*
(
p
[
1
]
+
z
*
(
p
[
2
]
+
z
*
(
p
[
3
]
+
z
*
(
p
[
4
]
+
z
*
p
[
5
]))));
s
=
one
+
z
*
(
q
[
0
]
+
z
*
(
q
[
1
]
+
z
*
(
q
[
2
]
+
z
*
(
q
[
3
]
+
z
*
q
[
4
]))));
return
one
+
r
/
s
;
}
/* For x >= 8, the asymptotic expansions of qzero is
* -1/8 s + 75/1024 s^3 - ..., where s = 1/x.
* We approximate pzero by
* qzero(x) = s*(-1.25 + (R/S))
* where R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10
* S = 1 + qS0*s^2 + ... + qS5*s^12
* and
* | qzero(x)/s +1.25-R/S | <= 2 ** ( -61.22)
*/
#ifdef __STDC__
static
const
double
qR8
[
6
]
=
{
/* for x in [inf, 8]=1/[0,0.125] */
#else
static
double
qR8
[
6
]
=
{
/* for x in [inf, 8]=1/[0,0.125] */
#endif
0.00000000000000000000e+00
,
/* 0x00000000, 0x00000000 */
7.32421874999935051953e-02
,
/* 0x3FB2BFFF, 0xFFFFFE2C */
1.17682064682252693899e+01
,
/* 0x40278952, 0x5BB334D6 */
5.57673380256401856059e+02
,
/* 0x40816D63, 0x15301825 */
8.85919720756468632317e+03
,
/* 0x40C14D99, 0x3E18F46D */
3.70146267776887834771e+04
,
/* 0x40E212D4, 0x0E901566 */
};
#ifdef __STDC__
static
const
double
qS8
[
6
]
=
{
#else
static
double
qS8
[
6
]
=
{
#endif
1.63776026895689824414e+02
,
/* 0x406478D5, 0x365B39BC */
8.09834494656449805916e+03
,
/* 0x40BFA258, 0x4E6B0563 */
1.42538291419120476348e+05
,
/* 0x41016652, 0x54D38C3F */
8.03309257119514397345e+05
,
/* 0x412883DA, 0x83A52B43 */
8.40501579819060512818e+05
,
/* 0x4129A66B, 0x28DE0B3D */
-
3.43899293537866615225e+05
,
/* 0xC114FD6D, 0x2C9530C5 */
};
#ifdef __STDC__
static
const
double
qR5
[
6
]
=
{
/* for x in [8,4.5454]=1/[0.125,0.22001] */
#else
static
double
qR5
[
6
]
=
{
/* for x in [8,4.5454]=1/[0.125,0.22001] */
#endif
1.84085963594515531381e-11
,
/* 0x3DB43D8F, 0x29CC8CD9 */
7.32421766612684765896e-02
,
/* 0x3FB2BFFF, 0xD172B04C */
5.83563508962056953777e+00
,
/* 0x401757B0, 0xB9953DD3 */
1.35111577286449829671e+02
,
/* 0x4060E392, 0x0A8788E9 */
1.02724376596164097464e+03
,
/* 0x40900CF9, 0x9DC8C481 */
1.98997785864605384631e+03
,
/* 0x409F17E9, 0x53C6E3A6 */
};
#ifdef __STDC__
static
const
double
qS5
[
6
]
=
{
#else
static
double
qS5
[
6
]
=
{
#endif
8.27766102236537761883e+01
,
/* 0x4054B1B3, 0xFB5E1543 */
2.07781416421392987104e+03
,
/* 0x40A03BA0, 0xDA21C0CE */
1.88472887785718085070e+04
,
/* 0x40D267D2, 0x7B591E6D */
5.67511122894947329769e+04
,
/* 0x40EBB5E3, 0x97E02372 */
3.59767538425114471465e+04
,
/* 0x40E19118, 0x1F7A54A0 */
-
5.35434275601944773371e+03
,
/* 0xC0B4EA57, 0xBEDBC609 */
};
#ifdef __STDC__
static
const
double
qR3
[
6
]
=
{
/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
#else
static
double
qR3
[
6
]
=
{
/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
#endif
4.37741014089738620906e-09
,
/* 0x3E32CD03, 0x6ADECB82 */
7.32411180042911447163e-02
,
/* 0x3FB2BFEE, 0x0E8D0842 */
3.34423137516170720929e+00
,
/* 0x400AC0FC, 0x61149CF5 */
4.26218440745412650017e+01
,
/* 0x40454F98, 0x962DAEDD */
1.70808091340565596283e+02
,
/* 0x406559DB, 0xE25EFD1F */
1.66733948696651168575e+02
,
/* 0x4064D77C, 0x81FA21E0 */
};
#ifdef __STDC__
static
const
double
qS3
[
6
]
=
{
#else
static
double
qS3
[
6
]
=
{
#endif
4.87588729724587182091e+01
,
/* 0x40486122, 0xBFE343A6 */
7.09689221056606015736e+02
,
/* 0x40862D83, 0x86544EB3 */
3.70414822620111362994e+03
,
/* 0x40ACF04B, 0xE44DFC63 */
6.46042516752568917582e+03
,
/* 0x40B93C6C, 0xD7C76A28 */
2.51633368920368957333e+03
,
/* 0x40A3A8AA, 0xD94FB1C0 */
-
1.49247451836156386662e+02
,
/* 0xC062A7EB, 0x201CF40F */
};
#ifdef __STDC__
static
const
double
qR2
[
6
]
=
{
/* for x in [2.8570,2]=1/[0.3499,0.5] */
#else
static
double
qR2
[
6
]
=
{
/* for x in [2.8570,2]=1/[0.3499,0.5] */
#endif
1.50444444886983272379e-07
,
/* 0x3E84313B, 0x54F76BDB */
7.32234265963079278272e-02
,
/* 0x3FB2BEC5, 0x3E883E34 */
1.99819174093815998816e+00
,
/* 0x3FFFF897, 0xE727779C */
1.44956029347885735348e+01
,
/* 0x402CFDBF, 0xAAF96FE5 */
3.16662317504781540833e+01
,
/* 0x403FAA8E, 0x29FBDC4A */
1.62527075710929267416e+01
,
/* 0x403040B1, 0x71814BB4 */
};
#ifdef __STDC__
static
const
double
qS2
[
6
]
=
{
#else
static
double
qS2
[
6
]
=
{
#endif
3.03655848355219184498e+01
,
/* 0x403E5D96, 0xF7C07AED */
2.69348118608049844624e+02
,
/* 0x4070D591, 0xE4D14B40 */
8.44783757595320139444e+02
,
/* 0x408A6645, 0x22B3BF22 */
8.82935845112488550512e+02
,
/* 0x408B977C, 0x9C5CC214 */
2.12666388511798828631e+02
,
/* 0x406A9553, 0x0E001365 */
-
5.31095493882666946917e+00
,
/* 0xC0153E6A, 0xF8B32931 */
};
#ifdef __STDC__
static
double
qzero
(
double
x
)
#else
static
double
qzero
(
x
)
double
x
;
#endif
{
#ifdef __STDC__
const
double
*
p
=
(
void
*
)
0
,
*
q
=
(
void
*
)
0
;
#else
double
*
p
,
*
q
;
#endif
double
s
,
r
,
z
;
int
ix
;
ix
=
0x7fffffff
&
__HI
(
x
);
if
(
ix
>=
0x40200000
)
{
p
=
qR8
;
q
=
qS8
;}
else
if
(
ix
>=
0x40122E8B
){
p
=
qR5
;
q
=
qS5
;}
else
if
(
ix
>=
0x4006DB6D
){
p
=
qR3
;
q
=
qS3
;}
else
if
(
ix
>=
0x40000000
){
p
=
qR2
;
q
=
qS2
;}
z
=
one
/
(
x
*
x
);
r
=
p
[
0
]
+
z
*
(
p
[
1
]
+
z
*
(
p
[
2
]
+
z
*
(
p
[
3
]
+
z
*
(
p
[
4
]
+
z
*
p
[
5
]))));
s
=
one
+
z
*
(
q
[
0
]
+
z
*
(
q
[
1
]
+
z
*
(
q
[
2
]
+
z
*
(
q
[
3
]
+
z
*
(
q
[
4
]
+
z
*
q
[
5
])))));
return
(
-
.
125
+
r
/
s
)
/
x
;
}
src/share/native/java/lang/fdlibm/src/e_j1.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* __ieee754_j1(x), __ieee754_y1(x)
* Bessel function of the first and second kinds of order zero.
* Method -- j1(x):
* 1. For tiny x, we use j1(x) = x/2 - x^3/16 + x^5/384 - ...
* 2. Reduce x to |x| since j1(x)=-j1(-x), and
* for x in (0,2)
* j1(x) = x/2 + x*z*R0/S0, where z = x*x;
* (precision: |j1/x - 1/2 - R0/S0 |<2**-61.51 )
* for x in (2,inf)
* j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1))
* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
* where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
* as follow:
* cos(x1) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
* = 1/sqrt(2) * (sin(x) - cos(x))
* sin(x1) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
* = -1/sqrt(2) * (sin(x) + cos(x))
* (To avoid cancellation, use
* sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
* to compute the worse one.)
*
* 3 Special cases
* j1(nan)= nan
* j1(0) = 0
* j1(inf) = 0
*
* Method -- y1(x):
* 1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN
* 2. For x<2.
* Since
* y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x^3-...)
* therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function.
* We use the following function to approximate y1,
* y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x^2
* where for x in [0,2] (abs err less than 2**-65.89)
* U(z) = U0[0] + U0[1]*z + ... + U0[4]*z^4
* V(z) = 1 + v0[0]*z + ... + v0[4]*z^5
* Note: For tiny x, 1/x dominate y1 and hence
* y1(tiny) = -2/pi/tiny, (choose tiny<2**-54)
* 3. For x>=2.
* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
* where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
* by method mentioned above.
*/
#include "fdlibm.h"
#ifdef __STDC__
static
double
pone
(
double
),
qone
(
double
);
#else
static
double
pone
(),
qone
();
#endif
#ifdef __STDC__
static
const
double
#else
static
double
#endif
huge
=
1e300
,
one
=
1
.
0
,
invsqrtpi
=
5.64189583547756279280e-01
,
/* 0x3FE20DD7, 0x50429B6D */
tpi
=
6.36619772367581382433e-01
,
/* 0x3FE45F30, 0x6DC9C883 */
/* R0/S0 on [0,2] */
r00
=
-
6.25000000000000000000e-02
,
/* 0xBFB00000, 0x00000000 */
r01
=
1.40705666955189706048e-03
,
/* 0x3F570D9F, 0x98472C61 */
r02
=
-
1.59955631084035597520e-05
,
/* 0xBEF0C5C6, 0xBA169668 */
r03
=
4.96727999609584448412e-08
,
/* 0x3E6AAAFA, 0x46CA0BD9 */
s01
=
1.91537599538363460805e-02
,
/* 0x3F939D0B, 0x12637E53 */
s02
=
1.85946785588630915560e-04
,
/* 0x3F285F56, 0xB9CDF664 */
s03
=
1.17718464042623683263e-06
,
/* 0x3EB3BFF8, 0x333F8498 */
s04
=
5.04636257076217042715e-09
,
/* 0x3E35AC88, 0xC97DFF2C */
s05
=
1.23542274426137913908e-11
;
/* 0x3DAB2ACF, 0xCFB97ED8 */
static
double
zero
=
0
.
0
;
#ifdef __STDC__
double
__ieee754_j1
(
double
x
)
#else
double
__ieee754_j1
(
x
)
double
x
;
#endif
{
double
z
,
s
,
c
,
ss
,
cc
,
r
,
u
,
v
,
y
;
int
hx
,
ix
;
hx
=
__HI
(
x
);
ix
=
hx
&
0x7fffffff
;
if
(
ix
>=
0x7ff00000
)
return
one
/
x
;
y
=
fabs
(
x
);
if
(
ix
>=
0x40000000
)
{
/* |x| >= 2.0 */
s
=
sin
(
y
);
c
=
cos
(
y
);
ss
=
-
s
-
c
;
cc
=
s
-
c
;
if
(
ix
<
0x7fe00000
)
{
/* make sure y+y not overflow */
z
=
cos
(
y
+
y
);
if
((
s
*
c
)
>
zero
)
cc
=
z
/
ss
;
else
ss
=
z
/
cc
;
}
/*
* j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
* y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
*/
if
(
ix
>
0x48000000
)
z
=
(
invsqrtpi
*
cc
)
/
sqrt
(
y
);
else
{
u
=
pone
(
y
);
v
=
qone
(
y
);
z
=
invsqrtpi
*
(
u
*
cc
-
v
*
ss
)
/
sqrt
(
y
);
}
if
(
hx
<
0
)
return
-
z
;
else
return
z
;
}
if
(
ix
<
0x3e400000
)
{
/* |x|<2**-27 */
if
(
huge
+
x
>
one
)
return
0
.
5
*
x
;
/* inexact if x!=0 necessary */
}
z
=
x
*
x
;
r
=
z
*
(
r00
+
z
*
(
r01
+
z
*
(
r02
+
z
*
r03
)));
s
=
one
+
z
*
(
s01
+
z
*
(
s02
+
z
*
(
s03
+
z
*
(
s04
+
z
*
s05
))));
r
*=
x
;
return
(
x
*
0
.
5
+
r
/
s
);
}
#ifdef __STDC__
static
const
double
U0
[
5
]
=
{
#else
static
double
U0
[
5
]
=
{
#endif
-
1.96057090646238940668e-01
,
/* 0xBFC91866, 0x143CBC8A */
5.04438716639811282616e-02
,
/* 0x3FA9D3C7, 0x76292CD1 */
-
1.91256895875763547298e-03
,
/* 0xBF5F55E5, 0x4844F50F */
2.35252600561610495928e-05
,
/* 0x3EF8AB03, 0x8FA6B88E */
-
9.19099158039878874504e-08
,
/* 0xBE78AC00, 0x569105B8 */
};
#ifdef __STDC__
static
const
double
V0
[
5
]
=
{
#else
static
double
V0
[
5
]
=
{
#endif
1.99167318236649903973e-02
,
/* 0x3F94650D, 0x3F4DA9F0 */
2.02552581025135171496e-04
,
/* 0x3F2A8C89, 0x6C257764 */
1.35608801097516229404e-06
,
/* 0x3EB6C05A, 0x894E8CA6 */
6.22741452364621501295e-09
,
/* 0x3E3ABF1D, 0x5BA69A86 */
1.66559246207992079114e-11
,
/* 0x3DB25039, 0xDACA772A */
};
#ifdef __STDC__
double
__ieee754_y1
(
double
x
)
#else
double
__ieee754_y1
(
x
)
double
x
;
#endif
{
double
z
,
s
,
c
,
ss
,
cc
,
u
,
v
;
int
hx
,
ix
,
lx
;
hx
=
__HI
(
x
);
ix
=
0x7fffffff
&
hx
;
lx
=
__LO
(
x
);
/* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */
if
(
ix
>=
0x7ff00000
)
return
one
/
(
x
+
x
*
x
);
if
((
ix
|
lx
)
==
0
)
return
-
one
/
zero
;
if
(
hx
<
0
)
return
zero
/
zero
;
if
(
ix
>=
0x40000000
)
{
/* |x| >= 2.0 */
s
=
sin
(
x
);
c
=
cos
(
x
);
ss
=
-
s
-
c
;
cc
=
s
-
c
;
if
(
ix
<
0x7fe00000
)
{
/* make sure x+x not overflow */
z
=
cos
(
x
+
x
);
if
((
s
*
c
)
>
zero
)
cc
=
z
/
ss
;
else
ss
=
z
/
cc
;
}
/* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x0)+q1(x)*cos(x0))
* where x0 = x-3pi/4
* Better formula:
* cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
* = 1/sqrt(2) * (sin(x) - cos(x))
* sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
* = -1/sqrt(2) * (cos(x) + sin(x))
* To avoid cancellation, use
* sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
* to compute the worse one.
*/
if
(
ix
>
0x48000000
)
z
=
(
invsqrtpi
*
ss
)
/
sqrt
(
x
);
else
{
u
=
pone
(
x
);
v
=
qone
(
x
);
z
=
invsqrtpi
*
(
u
*
ss
+
v
*
cc
)
/
sqrt
(
x
);
}
return
z
;
}
if
(
ix
<=
0x3c900000
)
{
/* x < 2**-54 */
return
(
-
tpi
/
x
);
}
z
=
x
*
x
;
u
=
U0
[
0
]
+
z
*
(
U0
[
1
]
+
z
*
(
U0
[
2
]
+
z
*
(
U0
[
3
]
+
z
*
U0
[
4
])));
v
=
one
+
z
*
(
V0
[
0
]
+
z
*
(
V0
[
1
]
+
z
*
(
V0
[
2
]
+
z
*
(
V0
[
3
]
+
z
*
V0
[
4
]))));
return
(
x
*
(
u
/
v
)
+
tpi
*
(
__ieee754_j1
(
x
)
*
__ieee754_log
(
x
)
-
one
/
x
));
}
/* For x >= 8, the asymptotic expansions of pone is
* 1 + 15/128 s^2 - 4725/2^15 s^4 - ..., where s = 1/x.
* We approximate pone by
* pone(x) = 1 + (R/S)
* where R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10
* S = 1 + ps0*s^2 + ... + ps4*s^10
* and
* | pone(x)-1-R/S | <= 2 ** ( -60.06)
*/
#ifdef __STDC__
static
const
double
pr8
[
6
]
=
{
/* for x in [inf, 8]=1/[0,0.125] */
#else
static
double
pr8
[
6
]
=
{
/* for x in [inf, 8]=1/[0,0.125] */
#endif
0.00000000000000000000e+00
,
/* 0x00000000, 0x00000000 */
1.17187499999988647970e-01
,
/* 0x3FBDFFFF, 0xFFFFFCCE */
1.32394806593073575129e+01
,
/* 0x402A7A9D, 0x357F7FCE */
4.12051854307378562225e+02
,
/* 0x4079C0D4, 0x652EA590 */
3.87474538913960532227e+03
,
/* 0x40AE457D, 0xA3A532CC */
7.91447954031891731574e+03
,
/* 0x40BEEA7A, 0xC32782DD */
};
#ifdef __STDC__
static
const
double
ps8
[
5
]
=
{
#else
static
double
ps8
[
5
]
=
{
#endif
1.14207370375678408436e+02
,
/* 0x405C8D45, 0x8E656CAC */
3.65093083420853463394e+03
,
/* 0x40AC85DC, 0x964D274F */
3.69562060269033463555e+04
,
/* 0x40E20B86, 0x97C5BB7F */
9.76027935934950801311e+04
,
/* 0x40F7D42C, 0xB28F17BB */
3.08042720627888811578e+04
,
/* 0x40DE1511, 0x697A0B2D */
};
#ifdef __STDC__
static
const
double
pr5
[
6
]
=
{
/* for x in [8,4.5454]=1/[0.125,0.22001] */
#else
static
double
pr5
[
6
]
=
{
/* for x in [8,4.5454]=1/[0.125,0.22001] */
#endif
1.31990519556243522749e-11
,
/* 0x3DAD0667, 0xDAE1CA7D */
1.17187493190614097638e-01
,
/* 0x3FBDFFFF, 0xE2C10043 */
6.80275127868432871736e+00
,
/* 0x401B3604, 0x6E6315E3 */
1.08308182990189109773e+02
,
/* 0x405B13B9, 0x452602ED */
5.17636139533199752805e+02
,
/* 0x40802D16, 0xD052D649 */
5.28715201363337541807e+02
,
/* 0x408085B8, 0xBB7E0CB7 */
};
#ifdef __STDC__
static
const
double
ps5
[
5
]
=
{
#else
static
double
ps5
[
5
]
=
{
#endif
5.92805987221131331921e+01
,
/* 0x404DA3EA, 0xA8AF633D */
9.91401418733614377743e+02
,
/* 0x408EFB36, 0x1B066701 */
5.35326695291487976647e+03
,
/* 0x40B4E944, 0x5706B6FB */
7.84469031749551231769e+03
,
/* 0x40BEA4B0, 0xB8A5BB15 */
1.50404688810361062679e+03
,
/* 0x40978030, 0x036F5E51 */
};
#ifdef __STDC__
static
const
double
pr3
[
6
]
=
{
#else
static
double
pr3
[
6
]
=
{
/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
#endif
3.02503916137373618024e-09
,
/* 0x3E29FC21, 0xA7AD9EDD */
1.17186865567253592491e-01
,
/* 0x3FBDFFF5, 0x5B21D17B */
3.93297750033315640650e+00
,
/* 0x400F76BC, 0xE85EAD8A */
3.51194035591636932736e+01
,
/* 0x40418F48, 0x9DA6D129 */
9.10550110750781271918e+01
,
/* 0x4056C385, 0x4D2C1837 */
4.85590685197364919645e+01
,
/* 0x4048478F, 0x8EA83EE5 */
};
#ifdef __STDC__
static
const
double
ps3
[
5
]
=
{
#else
static
double
ps3
[
5
]
=
{
#endif
3.47913095001251519989e+01
,
/* 0x40416549, 0xA134069C */
3.36762458747825746741e+02
,
/* 0x40750C33, 0x07F1A75F */
1.04687139975775130551e+03
,
/* 0x40905B7C, 0x5037D523 */
8.90811346398256432622e+02
,
/* 0x408BD67D, 0xA32E31E9 */
1.03787932439639277504e+02
,
/* 0x4059F26D, 0x7C2EED53 */
};
#ifdef __STDC__
static
const
double
pr2
[
6
]
=
{
/* for x in [2.8570,2]=1/[0.3499,0.5] */
#else
static
double
pr2
[
6
]
=
{
/* for x in [2.8570,2]=1/[0.3499,0.5] */
#endif
1.07710830106873743082e-07
,
/* 0x3E7CE9D4, 0xF65544F4 */
1.17176219462683348094e-01
,
/* 0x3FBDFF42, 0xBE760D83 */
2.36851496667608785174e+00
,
/* 0x4002F2B7, 0xF98FAEC0 */
1.22426109148261232917e+01
,
/* 0x40287C37, 0x7F71A964 */
1.76939711271687727390e+01
,
/* 0x4031B1A8, 0x177F8EE2 */
5.07352312588818499250e+00
,
/* 0x40144B49, 0xA574C1FE */
};
#ifdef __STDC__
static
const
double
ps2
[
5
]
=
{
#else
static
double
ps2
[
5
]
=
{
#endif
2.14364859363821409488e+01
,
/* 0x40356FBD, 0x8AD5ECDC */
1.25290227168402751090e+02
,
/* 0x405F5293, 0x14F92CD5 */
2.32276469057162813669e+02
,
/* 0x406D08D8, 0xD5A2DBD9 */
1.17679373287147100768e+02
,
/* 0x405D6B7A, 0xDA1884A9 */
8.36463893371618283368e+00
,
/* 0x4020BAB1, 0xF44E5192 */
};
#ifdef __STDC__
static
double
pone
(
double
x
)
#else
static
double
pone
(
x
)
double
x
;
#endif
{
#ifdef __STDC__
const
double
*
p
=
(
void
*
)
0
,
*
q
=
(
void
*
)
0
;
#else
double
*
p
,
*
q
;
#endif
double
z
,
r
,
s
;
int
ix
;
ix
=
0x7fffffff
&
__HI
(
x
);
if
(
ix
>=
0x40200000
)
{
p
=
pr8
;
q
=
ps8
;}
else
if
(
ix
>=
0x40122E8B
){
p
=
pr5
;
q
=
ps5
;}
else
if
(
ix
>=
0x4006DB6D
){
p
=
pr3
;
q
=
ps3
;}
else
if
(
ix
>=
0x40000000
){
p
=
pr2
;
q
=
ps2
;}
z
=
one
/
(
x
*
x
);
r
=
p
[
0
]
+
z
*
(
p
[
1
]
+
z
*
(
p
[
2
]
+
z
*
(
p
[
3
]
+
z
*
(
p
[
4
]
+
z
*
p
[
5
]))));
s
=
one
+
z
*
(
q
[
0
]
+
z
*
(
q
[
1
]
+
z
*
(
q
[
2
]
+
z
*
(
q
[
3
]
+
z
*
q
[
4
]))));
return
one
+
r
/
s
;
}
/* For x >= 8, the asymptotic expansions of qone is
* 3/8 s - 105/1024 s^3 - ..., where s = 1/x.
* We approximate pone by
* qone(x) = s*(0.375 + (R/S))
* where R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10
* S = 1 + qs1*s^2 + ... + qs6*s^12
* and
* | qone(x)/s -0.375-R/S | <= 2 ** ( -61.13)
*/
#ifdef __STDC__
static
const
double
qr8
[
6
]
=
{
/* for x in [inf, 8]=1/[0,0.125] */
#else
static
double
qr8
[
6
]
=
{
/* for x in [inf, 8]=1/[0,0.125] */
#endif
0.00000000000000000000e+00
,
/* 0x00000000, 0x00000000 */
-
1.02539062499992714161e-01
,
/* 0xBFBA3FFF, 0xFFFFFDF3 */
-
1.62717534544589987888e+01
,
/* 0xC0304591, 0xA26779F7 */
-
7.59601722513950107896e+02
,
/* 0xC087BCD0, 0x53E4B576 */
-
1.18498066702429587167e+04
,
/* 0xC0C724E7, 0x40F87415 */
-
4.84385124285750353010e+04
,
/* 0xC0E7A6D0, 0x65D09C6A */
};
#ifdef __STDC__
static
const
double
qs8
[
6
]
=
{
#else
static
double
qs8
[
6
]
=
{
#endif
1.61395369700722909556e+02
,
/* 0x40642CA6, 0xDE5BCDE5 */
7.82538599923348465381e+03
,
/* 0x40BE9162, 0xD0D88419 */
1.33875336287249578163e+05
,
/* 0x4100579A, 0xB0B75E98 */
7.19657723683240939863e+05
,
/* 0x4125F653, 0x72869C19 */
6.66601232617776375264e+05
,
/* 0x412457D2, 0x7719AD5C */
-
2.94490264303834643215e+05
,
/* 0xC111F969, 0x0EA5AA18 */
};
#ifdef __STDC__
static
const
double
qr5
[
6
]
=
{
/* for x in [8,4.5454]=1/[0.125,0.22001] */
#else
static
double
qr5
[
6
]
=
{
/* for x in [8,4.5454]=1/[0.125,0.22001] */
#endif
-
2.08979931141764104297e-11
,
/* 0xBDB6FA43, 0x1AA1A098 */
-
1.02539050241375426231e-01
,
/* 0xBFBA3FFF, 0xCB597FEF */
-
8.05644828123936029840e+00
,
/* 0xC0201CE6, 0xCA03AD4B */
-
1.83669607474888380239e+02
,
/* 0xC066F56D, 0x6CA7B9B0 */
-
1.37319376065508163265e+03
,
/* 0xC09574C6, 0x6931734F */
-
2.61244440453215656817e+03
,
/* 0xC0A468E3, 0x88FDA79D */
};
#ifdef __STDC__
static
const
double
qs5
[
6
]
=
{
#else
static
double
qs5
[
6
]
=
{
#endif
8.12765501384335777857e+01
,
/* 0x405451B2, 0xFF5A11B2 */
1.99179873460485964642e+03
,
/* 0x409F1F31, 0xE77BF839 */
1.74684851924908907677e+04
,
/* 0x40D10F1F, 0x0D64CE29 */
4.98514270910352279316e+04
,
/* 0x40E8576D, 0xAABAD197 */
2.79480751638918118260e+04
,
/* 0x40DB4B04, 0xCF7C364B */
-
4.71918354795128470869e+03
,
/* 0xC0B26F2E, 0xFCFFA004 */
};
#ifdef __STDC__
static
const
double
qr3
[
6
]
=
{
#else
static
double
qr3
[
6
]
=
{
/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */
#endif
-
5.07831226461766561369e-09
,
/* 0xBE35CFA9, 0xD38FC84F */
-
1.02537829820837089745e-01
,
/* 0xBFBA3FEB, 0x51AEED54 */
-
4.61011581139473403113e+00
,
/* 0xC01270C2, 0x3302D9FF */
-
5.78472216562783643212e+01
,
/* 0xC04CEC71, 0xC25D16DA */
-
2.28244540737631695038e+02
,
/* 0xC06C87D3, 0x4718D55F */
-
2.19210128478909325622e+02
,
/* 0xC06B66B9, 0x5F5C1BF6 */
};
#ifdef __STDC__
static
const
double
qs3
[
6
]
=
{
#else
static
double
qs3
[
6
]
=
{
#endif
4.76651550323729509273e+01
,
/* 0x4047D523, 0xCCD367E4 */
6.73865112676699709482e+02
,
/* 0x40850EEB, 0xC031EE3E */
3.38015286679526343505e+03
,
/* 0x40AA684E, 0x448E7C9A */
5.54772909720722782367e+03
,
/* 0x40B5ABBA, 0xA61D54A6 */
1.90311919338810798763e+03
,
/* 0x409DBC7A, 0x0DD4DF4B */
-
1.35201191444307340817e+02
,
/* 0xC060E670, 0x290A311F */
};
#ifdef __STDC__
static
const
double
qr2
[
6
]
=
{
/* for x in [2.8570,2]=1/[0.3499,0.5] */
#else
static
double
qr2
[
6
]
=
{
/* for x in [2.8570,2]=1/[0.3499,0.5] */
#endif
-
1.78381727510958865572e-07
,
/* 0xBE87F126, 0x44C626D2 */
-
1.02517042607985553460e-01
,
/* 0xBFBA3E8E, 0x9148B010 */
-
2.75220568278187460720e+00
,
/* 0xC0060484, 0x69BB4EDA */
-
1.96636162643703720221e+01
,
/* 0xC033A9E2, 0xC168907F */
-
4.23253133372830490089e+01
,
/* 0xC04529A3, 0xDE104AAA */
-
2.13719211703704061733e+01
,
/* 0xC0355F36, 0x39CF6E52 */
};
#ifdef __STDC__
static
const
double
qs2
[
6
]
=
{
#else
static
double
qs2
[
6
]
=
{
#endif
2.95333629060523854548e+01
,
/* 0x403D888A, 0x78AE64FF */
2.52981549982190529136e+02
,
/* 0x406F9F68, 0xDB821CBA */
7.57502834868645436472e+02
,
/* 0x4087AC05, 0xCE49A0F7 */
7.39393205320467245656e+02
,
/* 0x40871B25, 0x48D4C029 */
1.55949003336666123687e+02
,
/* 0x40637E5E, 0x3C3ED8D4 */
-
4.95949898822628210127e+00
,
/* 0xC013D686, 0xE71BE86B */
};
#ifdef __STDC__
static
double
qone
(
double
x
)
#else
static
double
qone
(
x
)
double
x
;
#endif
{
#ifdef __STDC__
const
double
*
p
=
(
void
*
)
0
,
*
q
=
(
void
*
)
0
;
#else
double
*
p
,
*
q
;
#endif
double
s
,
r
,
z
;
int
ix
;
ix
=
0x7fffffff
&
__HI
(
x
);
if
(
ix
>=
0x40200000
)
{
p
=
qr8
;
q
=
qs8
;}
else
if
(
ix
>=
0x40122E8B
){
p
=
qr5
;
q
=
qs5
;}
else
if
(
ix
>=
0x4006DB6D
){
p
=
qr3
;
q
=
qs3
;}
else
if
(
ix
>=
0x40000000
){
p
=
qr2
;
q
=
qs2
;}
z
=
one
/
(
x
*
x
);
r
=
p
[
0
]
+
z
*
(
p
[
1
]
+
z
*
(
p
[
2
]
+
z
*
(
p
[
3
]
+
z
*
(
p
[
4
]
+
z
*
p
[
5
]))));
s
=
one
+
z
*
(
q
[
0
]
+
z
*
(
q
[
1
]
+
z
*
(
q
[
2
]
+
z
*
(
q
[
3
]
+
z
*
(
q
[
4
]
+
z
*
q
[
5
])))));
return
(.
375
+
r
/
s
)
/
x
;
}
src/share/native/java/lang/fdlibm/src/e_jn.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* __ieee754_jn(n, x), __ieee754_yn(n, x)
* floating point Bessel's function of the 1st and 2nd kind
* of order n
*
* Special cases:
* y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
* y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
* Note 2. About jn(n,x), yn(n,x)
* For n=0, j0(x) is called,
* for n=1, j1(x) is called,
* for n<x, forward recursion us used starting
* from values of j0(x) and j1(x).
* for n>x, a continued fraction approximation to
* j(n,x)/j(n-1,x) is evaluated and then backward
* recursion is used starting from a supposed value
* for j(n,x). The resulting value of j(0,x) is
* compared with the actual value to correct the
* supposed value of j(n,x).
*
* yn(n,x) is similar in all respects, except
* that forward recursion is used for all
* values of n>1.
*
*/
#include "fdlibm.h"
#ifdef __STDC__
static
const
double
#else
static
double
#endif
invsqrtpi
=
5.64189583547756279280e-01
,
/* 0x3FE20DD7, 0x50429B6D */
two
=
2.00000000000000000000e+00
,
/* 0x40000000, 0x00000000 */
one
=
1.00000000000000000000e+00
;
/* 0x3FF00000, 0x00000000 */
static
double
zero
=
0.00000000000000000000e+00
;
#ifdef __STDC__
double
__ieee754_jn
(
int
n
,
double
x
)
#else
double
__ieee754_jn
(
n
,
x
)
int
n
;
double
x
;
#endif
{
int
i
,
hx
,
ix
,
lx
,
sgn
;
double
a
,
b
,
temp
=
0
,
di
;
double
z
,
w
;
/* J(-n,x) = (-1)^n * J(n, x), J(n, -x) = (-1)^n * J(n, x)
* Thus, J(-n,x) = J(n,-x)
*/
hx
=
__HI
(
x
);
ix
=
0x7fffffff
&
hx
;
lx
=
__LO
(
x
);
/* if J(n,NaN) is NaN */
if
((
ix
|
((
unsigned
)(
lx
|-
lx
))
>>
31
)
>
0x7ff00000
)
return
x
+
x
;
if
(
n
<
0
){
n
=
-
n
;
x
=
-
x
;
hx
^=
0x80000000
;
}
if
(
n
==
0
)
return
(
__ieee754_j0
(
x
));
if
(
n
==
1
)
return
(
__ieee754_j1
(
x
));
sgn
=
(
n
&
1
)
&
(
hx
>>
31
);
/* even n -- 0, odd n -- sign(x) */
x
=
fabs
(
x
);
if
((
ix
|
lx
)
==
0
||
ix
>=
0x7ff00000
)
/* if x is 0 or inf */
b
=
zero
;
else
if
((
double
)
n
<=
x
)
{
/* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */
if
(
ix
>=
0x52D00000
)
{
/* x > 2**302 */
/* (x >> n**2)
* Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
* Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
* Let s=sin(x), c=cos(x),
* xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
*
* n sin(xn)*sqt2 cos(xn)*sqt2
* ----------------------------------
* 0 s-c c+s
* 1 -s-c -c+s
* 2 -s+c -c-s
* 3 s+c c-s
*/
switch
(
n
&
3
)
{
case
0
:
temp
=
cos
(
x
)
+
sin
(
x
);
break
;
case
1
:
temp
=
-
cos
(
x
)
+
sin
(
x
);
break
;
case
2
:
temp
=
-
cos
(
x
)
-
sin
(
x
);
break
;
case
3
:
temp
=
cos
(
x
)
-
sin
(
x
);
break
;
}
b
=
invsqrtpi
*
temp
/
sqrt
(
x
);
}
else
{
a
=
__ieee754_j0
(
x
);
b
=
__ieee754_j1
(
x
);
for
(
i
=
1
;
i
<
n
;
i
++
){
temp
=
b
;
b
=
b
*
((
double
)(
i
+
i
)
/
x
)
-
a
;
/* avoid underflow */
a
=
temp
;
}
}
}
else
{
if
(
ix
<
0x3e100000
)
{
/* x < 2**-29 */
/* x is tiny, return the first Taylor expansion of J(n,x)
* J(n,x) = 1/n!*(x/2)^n - ...
*/
if
(
n
>
33
)
/* underflow */
b
=
zero
;
else
{
temp
=
x
*
0
.
5
;
b
=
temp
;
for
(
a
=
one
,
i
=
2
;
i
<=
n
;
i
++
)
{
a
*=
(
double
)
i
;
/* a = n! */
b
*=
temp
;
/* b = (x/2)^n */
}
b
=
b
/
a
;
}
}
else
{
/* use backward recurrence */
/* x x^2 x^2
* J(n,x)/J(n-1,x) = ---- ------ ------ .....
* 2n - 2(n+1) - 2(n+2)
*
* 1 1 1
* (for large x) = ---- ------ ------ .....
* 2n 2(n+1) 2(n+2)
* -- - ------ - ------ -
* x x x
*
* Let w = 2n/x and h=2/x, then the above quotient
* is equal to the continued fraction:
* 1
* = -----------------------
* 1
* w - -----------------
* 1
* w+h - ---------
* w+2h - ...
*
* To determine how many terms needed, let
* Q(0) = w, Q(1) = w(w+h) - 1,
* Q(k) = (w+k*h)*Q(k-1) - Q(k-2),
* When Q(k) > 1e4 good for single
* When Q(k) > 1e9 good for double
* When Q(k) > 1e17 good for quadruple
*/
/* determine k */
double
t
,
v
;
double
q0
,
q1
,
h
,
tmp
;
int
k
,
m
;
w
=
(
n
+
n
)
/
(
double
)
x
;
h
=
2
.
0
/
(
double
)
x
;
q0
=
w
;
z
=
w
+
h
;
q1
=
w
*
z
-
1
.
0
;
k
=
1
;
while
(
q1
<
1.0e9
)
{
k
+=
1
;
z
+=
h
;
tmp
=
z
*
q1
-
q0
;
q0
=
q1
;
q1
=
tmp
;
}
m
=
n
+
n
;
for
(
t
=
zero
,
i
=
2
*
(
n
+
k
);
i
>=
m
;
i
-=
2
)
t
=
one
/
(
i
/
x
-
t
);
a
=
t
;
b
=
one
;
/* estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n)
* Hence, if n*(log(2n/x)) > ...
* single 8.8722839355e+01
* double 7.09782712893383973096e+02
* long double 1.1356523406294143949491931077970765006170e+04
* then recurrent value may overflow and the result is
* likely underflow to zero
*/
tmp
=
n
;
v
=
two
/
x
;
tmp
=
tmp
*
__ieee754_log
(
fabs
(
v
*
tmp
));
if
(
tmp
<
7.09782712893383973096e+02
)
{
for
(
i
=
n
-
1
,
di
=
(
double
)(
i
+
i
);
i
>
0
;
i
--
){
temp
=
b
;
b
*=
di
;
b
=
b
/
x
-
a
;
a
=
temp
;
di
-=
two
;
}
}
else
{
for
(
i
=
n
-
1
,
di
=
(
double
)(
i
+
i
);
i
>
0
;
i
--
){
temp
=
b
;
b
*=
di
;
b
=
b
/
x
-
a
;
a
=
temp
;
di
-=
two
;
/* scale b to avoid spurious overflow */
if
(
b
>
1e100
)
{
a
/=
b
;
t
/=
b
;
b
=
one
;
}
}
}
b
=
(
t
*
__ieee754_j0
(
x
)
/
b
);
}
}
if
(
sgn
==
1
)
return
-
b
;
else
return
b
;
}
#ifdef __STDC__
double
__ieee754_yn
(
int
n
,
double
x
)
#else
double
__ieee754_yn
(
n
,
x
)
int
n
;
double
x
;
#endif
{
int
i
,
hx
,
ix
,
lx
;
int
sign
;
double
a
,
b
,
temp
=
0
;
hx
=
__HI
(
x
);
ix
=
0x7fffffff
&
hx
;
lx
=
__LO
(
x
);
/* if Y(n,NaN) is NaN */
if
((
ix
|
((
unsigned
)(
lx
|-
lx
))
>>
31
)
>
0x7ff00000
)
return
x
+
x
;
if
((
ix
|
lx
)
==
0
)
return
-
one
/
zero
;
if
(
hx
<
0
)
return
zero
/
zero
;
sign
=
1
;
if
(
n
<
0
){
n
=
-
n
;
sign
=
1
-
((
n
&
1
)
<<
1
);
}
if
(
n
==
0
)
return
(
__ieee754_y0
(
x
));
if
(
n
==
1
)
return
(
sign
*
__ieee754_y1
(
x
));
if
(
ix
==
0x7ff00000
)
return
zero
;
if
(
ix
>=
0x52D00000
)
{
/* x > 2**302 */
/* (x >> n**2)
* Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
* Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
* Let s=sin(x), c=cos(x),
* xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
*
* n sin(xn)*sqt2 cos(xn)*sqt2
* ----------------------------------
* 0 s-c c+s
* 1 -s-c -c+s
* 2 -s+c -c-s
* 3 s+c c-s
*/
switch
(
n
&
3
)
{
case
0
:
temp
=
sin
(
x
)
-
cos
(
x
);
break
;
case
1
:
temp
=
-
sin
(
x
)
-
cos
(
x
);
break
;
case
2
:
temp
=
-
sin
(
x
)
+
cos
(
x
);
break
;
case
3
:
temp
=
sin
(
x
)
+
cos
(
x
);
break
;
}
b
=
invsqrtpi
*
temp
/
sqrt
(
x
);
}
else
{
a
=
__ieee754_y0
(
x
);
b
=
__ieee754_y1
(
x
);
/* quit if b is -inf */
for
(
i
=
1
;
i
<
n
&&
(
__HI
(
b
)
!=
0xfff00000
);
i
++
){
temp
=
b
;
b
=
((
double
)(
i
+
i
)
/
x
)
*
b
-
a
;
a
=
temp
;
}
}
if
(
sign
>
0
)
return
b
;
else
return
-
b
;
}
src/share/native/java/lang/fdlibm/src/e_lgamma.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* __ieee754_lgamma(x)
* Return the logarithm of the Gamma function of x.
*
* Method: call __ieee754_lgamma_r
*/
#include "fdlibm.h"
extern
int
signgam
;
#ifdef __STDC__
double
__ieee754_lgamma
(
double
x
)
#else
double
__ieee754_lgamma
(
x
)
double
x
;
#endif
{
return
__ieee754_lgamma_r
(
x
,
&
signgam
);
}
src/share/native/java/lang/fdlibm/src/e_lgamma_r.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* __ieee754_lgamma_r(x, signgamp)
* Reentrant version of the logarithm of the Gamma function
* with user provide pointer for the sign of Gamma(x).
*
* Method:
* 1. Argument Reduction for 0 < x <= 8
* Since gamma(1+s)=s*gamma(s), for x in [0,8], we may
* reduce x to a number in [1.5,2.5] by
* lgamma(1+s) = log(s) + lgamma(s)
* for example,
* lgamma(7.3) = log(6.3) + lgamma(6.3)
* = log(6.3*5.3) + lgamma(5.3)
* = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3)
* 2. Polynomial approximation of lgamma around its
* minimun ymin=1.461632144968362245 to maintain monotonicity.
* On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use
* Let z = x-ymin;
* lgamma(x) = -1.214862905358496078218 + z^2*poly(z)
* where
* poly(z) is a 14 degree polynomial.
* 2. Rational approximation in the primary interval [2,3]
* We use the following approximation:
* s = x-2.0;
* lgamma(x) = 0.5*s + s*P(s)/Q(s)
* with accuracy
* |P/Q - (lgamma(x)-0.5s)| < 2**-61.71
* Our algorithms are based on the following observation
*
* zeta(2)-1 2 zeta(3)-1 3
* lgamma(2+s) = s*(1-Euler) + --------- * s - --------- * s + ...
* 2 3
*
* where Euler = 0.5771... is the Euler constant, which is very
* close to 0.5.
*
* 3. For x>=8, we have
* lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+....
* (better formula:
* lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...)
* Let z = 1/x, then we approximation
* f(z) = lgamma(x) - (x-0.5)(log(x)-1)
* by
* 3 5 11
* w = w0 + w1*z + w2*z + w3*z + ... + w6*z
* where
* |w - f(z)| < 2**-58.74
*
* 4. For negative x, since (G is gamma function)
* -x*G(-x)*G(x) = pi/sin(pi*x),
* we have
* G(x) = pi/(sin(pi*x)*(-x)*G(-x))
* since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0
* Hence, for x<0, signgam = sign(sin(pi*x)) and
* lgamma(x) = log(|Gamma(x)|)
* = log(pi/(|x*sin(pi*x)|)) - lgamma(-x);
* Note: one should avoid compute pi*(-x) directly in the
* computation of sin(pi*(-x)).
*
* 5. Special Cases
* lgamma(2+s) ~ s*(1-Euler) for tiny s
* lgamma(1)=lgamma(2)=0
* lgamma(x) ~ -log(x) for tiny x
* lgamma(0) = lgamma(inf) = inf
* lgamma(-integer) = +-inf
*
*/
#include "fdlibm.h"
#ifdef __STDC__
static
const
double
#else
static
double
#endif
two52
=
4.50359962737049600000e+15
,
/* 0x43300000, 0x00000000 */
half
=
5.00000000000000000000e-01
,
/* 0x3FE00000, 0x00000000 */
one
=
1.00000000000000000000e+00
,
/* 0x3FF00000, 0x00000000 */
pi
=
3.14159265358979311600e+00
,
/* 0x400921FB, 0x54442D18 */
a0
=
7.72156649015328655494e-02
,
/* 0x3FB3C467, 0xE37DB0C8 */
a1
=
3.22467033424113591611e-01
,
/* 0x3FD4A34C, 0xC4A60FAD */
a2
=
6.73523010531292681824e-02
,
/* 0x3FB13E00, 0x1A5562A7 */
a3
=
2.05808084325167332806e-02
,
/* 0x3F951322, 0xAC92547B */
a4
=
7.38555086081402883957e-03
,
/* 0x3F7E404F, 0xB68FEFE8 */
a5
=
2.89051383673415629091e-03
,
/* 0x3F67ADD8, 0xCCB7926B */
a6
=
1.19270763183362067845e-03
,
/* 0x3F538A94, 0x116F3F5D */
a7
=
5.10069792153511336608e-04
,
/* 0x3F40B6C6, 0x89B99C00 */
a8
=
2.20862790713908385557e-04
,
/* 0x3F2CF2EC, 0xED10E54D */
a9
=
1.08011567247583939954e-04
,
/* 0x3F1C5088, 0x987DFB07 */
a10
=
2.52144565451257326939e-05
,
/* 0x3EFA7074, 0x428CFA52 */
a11
=
4.48640949618915160150e-05
,
/* 0x3F07858E, 0x90A45837 */
tc
=
1.46163214496836224576e+00
,
/* 0x3FF762D8, 0x6356BE3F */
tf
=
-
1.21486290535849611461e-01
,
/* 0xBFBF19B9, 0xBCC38A42 */
/* tt = -(tail of tf) */
tt
=
-
3.63867699703950536541e-18
,
/* 0xBC50C7CA, 0xA48A971F */
t0
=
4.83836122723810047042e-01
,
/* 0x3FDEF72B, 0xC8EE38A2 */
t1
=
-
1.47587722994593911752e-01
,
/* 0xBFC2E427, 0x8DC6C509 */
t2
=
6.46249402391333854778e-02
,
/* 0x3FB08B42, 0x94D5419B */
t3
=
-
3.27885410759859649565e-02
,
/* 0xBFA0C9A8, 0xDF35B713 */
t4
=
1.79706750811820387126e-02
,
/* 0x3F9266E7, 0x970AF9EC */
t5
=
-
1.03142241298341437450e-02
,
/* 0xBF851F9F, 0xBA91EC6A */
t6
=
6.10053870246291332635e-03
,
/* 0x3F78FCE0, 0xE370E344 */
t7
=
-
3.68452016781138256760e-03
,
/* 0xBF6E2EFF, 0xB3E914D7 */
t8
=
2.25964780900612472250e-03
,
/* 0x3F6282D3, 0x2E15C915 */
t9
=
-
1.40346469989232843813e-03
,
/* 0xBF56FE8E, 0xBF2D1AF1 */
t10
=
8.81081882437654011382e-04
,
/* 0x3F4CDF0C, 0xEF61A8E9 */
t11
=
-
5.38595305356740546715e-04
,
/* 0xBF41A610, 0x9C73E0EC */
t12
=
3.15632070903625950361e-04
,
/* 0x3F34AF6D, 0x6C0EBBF7 */
t13
=
-
3.12754168375120860518e-04
,
/* 0xBF347F24, 0xECC38C38 */
t14
=
3.35529192635519073543e-04
,
/* 0x3F35FD3E, 0xE8C2D3F4 */
u0
=
-
7.72156649015328655494e-02
,
/* 0xBFB3C467, 0xE37DB0C8 */
u1
=
6.32827064025093366517e-01
,
/* 0x3FE4401E, 0x8B005DFF */
u2
=
1.45492250137234768737e+00
,
/* 0x3FF7475C, 0xD119BD6F */
u3
=
9.77717527963372745603e-01
,
/* 0x3FEF4976, 0x44EA8450 */
u4
=
2.28963728064692451092e-01
,
/* 0x3FCD4EAE, 0xF6010924 */
u5
=
1.33810918536787660377e-02
,
/* 0x3F8B678B, 0xBF2BAB09 */
v1
=
2.45597793713041134822e+00
,
/* 0x4003A5D7, 0xC2BD619C */
v2
=
2.12848976379893395361e+00
,
/* 0x40010725, 0xA42B18F5 */
v3
=
7.69285150456672783825e-01
,
/* 0x3FE89DFB, 0xE45050AF */
v4
=
1.04222645593369134254e-01
,
/* 0x3FBAAE55, 0xD6537C88 */
v5
=
3.21709242282423911810e-03
,
/* 0x3F6A5ABB, 0x57D0CF61 */
s0
=
-
7.72156649015328655494e-02
,
/* 0xBFB3C467, 0xE37DB0C8 */
s1
=
2.14982415960608852501e-01
,
/* 0x3FCB848B, 0x36E20878 */
s2
=
3.25778796408930981787e-01
,
/* 0x3FD4D98F, 0x4F139F59 */
s3
=
1.46350472652464452805e-01
,
/* 0x3FC2BB9C, 0xBEE5F2F7 */
s4
=
2.66422703033638609560e-02
,
/* 0x3F9B481C, 0x7E939961 */
s5
=
1.84028451407337715652e-03
,
/* 0x3F5E26B6, 0x7368F239 */
s6
=
3.19475326584100867617e-05
,
/* 0x3F00BFEC, 0xDD17E945 */
r1
=
1.39200533467621045958e+00
,
/* 0x3FF645A7, 0x62C4AB74 */
r2
=
7.21935547567138069525e-01
,
/* 0x3FE71A18, 0x93D3DCDC */
r3
=
1.71933865632803078993e-01
,
/* 0x3FC601ED, 0xCCFBDF27 */
r4
=
1.86459191715652901344e-02
,
/* 0x3F9317EA, 0x742ED475 */
r5
=
7.77942496381893596434e-04
,
/* 0x3F497DDA, 0xCA41A95B */
r6
=
7.32668430744625636189e-06
,
/* 0x3EDEBAF7, 0xA5B38140 */
w0
=
4.18938533204672725052e-01
,
/* 0x3FDACFE3, 0x90C97D69 */
w1
=
8.33333333333329678849e-02
,
/* 0x3FB55555, 0x5555553B */
w2
=
-
2.77777777728775536470e-03
,
/* 0xBF66C16C, 0x16B02E5C */
w3
=
7.93650558643019558500e-04
,
/* 0x3F4A019F, 0x98CF38B6 */
w4
=
-
5.95187557450339963135e-04
,
/* 0xBF4380CB, 0x8C0FE741 */
w5
=
8.36339918996282139126e-04
,
/* 0x3F4B67BA, 0x4CDAD5D1 */
w6
=
-
1.63092934096575273989e-03
;
/* 0xBF5AB89D, 0x0B9E43E4 */
static
double
zero
=
0.00000000000000000000e+00
;
#ifdef __STDC__
static
double
sin_pi
(
double
x
)
#else
static
double
sin_pi
(
x
)
double
x
;
#endif
{
double
y
,
z
;
int
n
,
ix
;
ix
=
0x7fffffff
&
__HI
(
x
);
if
(
ix
<
0x3fd00000
)
return
__kernel_sin
(
pi
*
x
,
zero
,
0
);
y
=
-
x
;
/* x is assume negative */
/*
* argument reduction, make sure inexact flag not raised if input
* is an integer
*/
z
=
floor
(
y
);
if
(
z
!=
y
)
{
/* inexact anyway */
y
*=
0
.
5
;
y
=
2
.
0
*
(
y
-
floor
(
y
));
/* y = |x| mod 2.0 */
n
=
(
int
)
(
y
*
4
.
0
);
}
else
{
if
(
ix
>=
0x43400000
)
{
y
=
zero
;
n
=
0
;
/* y must be even */
}
else
{
if
(
ix
<
0x43300000
)
z
=
y
+
two52
;
/* exact */
n
=
__LO
(
z
)
&
1
;
/* lower word of z */
y
=
n
;
n
<<=
2
;
}
}
switch
(
n
)
{
case
0
:
y
=
__kernel_sin
(
pi
*
y
,
zero
,
0
);
break
;
case
1
:
case
2
:
y
=
__kernel_cos
(
pi
*
(
0
.
5
-
y
),
zero
);
break
;
case
3
:
case
4
:
y
=
__kernel_sin
(
pi
*
(
one
-
y
),
zero
,
0
);
break
;
case
5
:
case
6
:
y
=
-
__kernel_cos
(
pi
*
(
y
-
1
.
5
),
zero
);
break
;
default:
y
=
__kernel_sin
(
pi
*
(
y
-
2
.
0
),
zero
,
0
);
break
;
}
return
-
y
;
}
#ifdef __STDC__
double
__ieee754_lgamma_r
(
double
x
,
int
*
signgamp
)
#else
double
__ieee754_lgamma_r
(
x
,
signgamp
)
double
x
;
int
*
signgamp
;
#endif
{
double
t
,
y
,
z
,
nadj
=
0
,
p
,
p1
,
p2
,
p3
,
q
,
r
,
w
;
int
i
,
hx
,
lx
,
ix
;
hx
=
__HI
(
x
);
lx
=
__LO
(
x
);
/* purge off +-inf, NaN, +-0, and negative arguments */
*
signgamp
=
1
;
ix
=
hx
&
0x7fffffff
;
if
(
ix
>=
0x7ff00000
)
return
x
*
x
;
if
((
ix
|
lx
)
==
0
)
return
one
/
zero
;
if
(
ix
<
0x3b900000
)
{
/* |x|<2**-70, return -log(|x|) */
if
(
hx
<
0
)
{
*
signgamp
=
-
1
;
return
-
__ieee754_log
(
-
x
);
}
else
return
-
__ieee754_log
(
x
);
}
if
(
hx
<
0
)
{
if
(
ix
>=
0x43300000
)
/* |x|>=2**52, must be -integer */
return
one
/
zero
;
t
=
sin_pi
(
x
);
if
(
t
==
zero
)
return
one
/
zero
;
/* -integer */
nadj
=
__ieee754_log
(
pi
/
fabs
(
t
*
x
));
if
(
t
<
zero
)
*
signgamp
=
-
1
;
x
=
-
x
;
}
/* purge off 1 and 2 */
if
((((
ix
-
0x3ff00000
)
|
lx
)
==
0
)
||
(((
ix
-
0x40000000
)
|
lx
)
==
0
))
r
=
0
;
/* for x < 2.0 */
else
if
(
ix
<
0x40000000
)
{
if
(
ix
<=
0x3feccccc
)
{
/* lgamma(x) = lgamma(x+1)-log(x) */
r
=
-
__ieee754_log
(
x
);
if
(
ix
>=
0x3FE76944
)
{
y
=
one
-
x
;
i
=
0
;}
else
if
(
ix
>=
0x3FCDA661
)
{
y
=
x
-
(
tc
-
one
);
i
=
1
;}
else
{
y
=
x
;
i
=
2
;}
}
else
{
r
=
zero
;
if
(
ix
>=
0x3FFBB4C3
)
{
y
=
2
.
0
-
x
;
i
=
0
;}
/* [1.7316,2] */
else
if
(
ix
>=
0x3FF3B4C4
)
{
y
=
x
-
tc
;
i
=
1
;}
/* [1.23,1.73] */
else
{
y
=
x
-
one
;
i
=
2
;}
}
switch
(
i
)
{
case
0
:
z
=
y
*
y
;
p1
=
a0
+
z
*
(
a2
+
z
*
(
a4
+
z
*
(
a6
+
z
*
(
a8
+
z
*
a10
))));
p2
=
z
*
(
a1
+
z
*
(
a3
+
z
*
(
a5
+
z
*
(
a7
+
z
*
(
a9
+
z
*
a11
)))));
p
=
y
*
p1
+
p2
;
r
+=
(
p
-
0
.
5
*
y
);
break
;
case
1
:
z
=
y
*
y
;
w
=
z
*
y
;
p1
=
t0
+
w
*
(
t3
+
w
*
(
t6
+
w
*
(
t9
+
w
*
t12
)));
/* parallel comp */
p2
=
t1
+
w
*
(
t4
+
w
*
(
t7
+
w
*
(
t10
+
w
*
t13
)));
p3
=
t2
+
w
*
(
t5
+
w
*
(
t8
+
w
*
(
t11
+
w
*
t14
)));
p
=
z
*
p1
-
(
tt
-
w
*
(
p2
+
y
*
p3
));
r
+=
(
tf
+
p
);
break
;
case
2
:
p1
=
y
*
(
u0
+
y
*
(
u1
+
y
*
(
u2
+
y
*
(
u3
+
y
*
(
u4
+
y
*
u5
)))));
p2
=
one
+
y
*
(
v1
+
y
*
(
v2
+
y
*
(
v3
+
y
*
(
v4
+
y
*
v5
))));
r
+=
(
-
0
.
5
*
y
+
p1
/
p2
);
}
}
else
if
(
ix
<
0x40200000
)
{
/* x < 8.0 */
i
=
(
int
)
x
;
t
=
zero
;
y
=
x
-
(
double
)
i
;
p
=
y
*
(
s0
+
y
*
(
s1
+
y
*
(
s2
+
y
*
(
s3
+
y
*
(
s4
+
y
*
(
s5
+
y
*
s6
))))));
q
=
one
+
y
*
(
r1
+
y
*
(
r2
+
y
*
(
r3
+
y
*
(
r4
+
y
*
(
r5
+
y
*
r6
)))));
r
=
half
*
y
+
p
/
q
;
z
=
one
;
/* lgamma(1+s) = log(s) + lgamma(s) */
switch
(
i
)
{
case
7
:
z
*=
(
y
+
6
.
0
);
/* FALLTHRU */
case
6
:
z
*=
(
y
+
5
.
0
);
/* FALLTHRU */
case
5
:
z
*=
(
y
+
4
.
0
);
/* FALLTHRU */
case
4
:
z
*=
(
y
+
3
.
0
);
/* FALLTHRU */
case
3
:
z
*=
(
y
+
2
.
0
);
/* FALLTHRU */
r
+=
__ieee754_log
(
z
);
break
;
}
/* 8.0 <= x < 2**58 */
}
else
if
(
ix
<
0x43900000
)
{
t
=
__ieee754_log
(
x
);
z
=
one
/
x
;
y
=
z
*
z
;
w
=
w0
+
z
*
(
w1
+
y
*
(
w2
+
y
*
(
w3
+
y
*
(
w4
+
y
*
(
w5
+
y
*
w6
)))));
r
=
(
x
-
half
)
*
(
t
-
one
)
+
w
;
}
else
/* 2**58 <= x <= inf */
r
=
x
*
(
__ieee754_log
(
x
)
-
one
);
if
(
hx
<
0
)
r
=
nadj
-
r
;
return
r
;
}
src/share/native/java/lang/fdlibm/src/s_asinh.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* asinh(x)
* Method :
* Based on
* asinh(x) = sign(x) * log [ |x| + sqrt(x*x+1) ]
* we have
* asinh(x) := x if 1+x*x=1,
* := sign(x)*(log(x)+ln2)) for large |x|, else
* := sign(x)*log(2|x|+1/(|x|+sqrt(x*x+1))) if|x|>2, else
* := sign(x)*log1p(|x| + x^2/(1 + sqrt(1+x^2)))
*/
#include "fdlibm.h"
#ifdef __STDC__
static
const
double
#else
static
double
#endif
one
=
1.00000000000000000000e+00
,
/* 0x3FF00000, 0x00000000 */
ln2
=
6.93147180559945286227e-01
,
/* 0x3FE62E42, 0xFEFA39EF */
huge
=
1.00000000000000000000e+300
;
#ifdef __STDC__
double
asinh
(
double
x
)
#else
double
asinh
(
x
)
double
x
;
#endif
{
double
t
,
w
;
int
hx
,
ix
;
hx
=
__HI
(
x
);
ix
=
hx
&
0x7fffffff
;
if
(
ix
>=
0x7ff00000
)
return
x
+
x
;
/* x is inf or NaN */
if
(
ix
<
0x3e300000
)
{
/* |x|<2**-28 */
if
(
huge
+
x
>
one
)
return
x
;
/* return x inexact except 0 */
}
if
(
ix
>
0x41b00000
)
{
/* |x| > 2**28 */
w
=
__ieee754_log
(
fabs
(
x
))
+
ln2
;
}
else
if
(
ix
>
0x40000000
)
{
/* 2**28 > |x| > 2.0 */
t
=
fabs
(
x
);
w
=
__ieee754_log
(
2
.
0
*
t
+
one
/
(
sqrt
(
x
*
x
+
one
)
+
t
));
}
else
{
/* 2.0 > |x| > 2**-28 */
t
=
x
*
x
;
w
=
log1p
(
fabs
(
x
)
+
t
/
(
one
+
sqrt
(
one
+
t
)));
}
if
(
hx
>
0
)
return
w
;
else
return
-
w
;
}
src/share/native/java/lang/fdlibm/src/s_erf.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* double erf(double x)
* double erfc(double x)
* x
* 2 |\
* erf(x) = --------- | exp(-t*t)dt
* sqrt(pi) \|
* 0
*
* erfc(x) = 1-erf(x)
* Note that
* erf(-x) = -erf(x)
* erfc(-x) = 2 - erfc(x)
*
* Method:
* 1. For |x| in [0, 0.84375]
* erf(x) = x + x*R(x^2)
* erfc(x) = 1 - erf(x) if x in [-.84375,0.25]
* = 0.5 + ((0.5-x)-x*R) if x in [0.25,0.84375]
* where R = P/Q where P is an odd poly of degree 8 and
* Q is an odd poly of degree 10.
* -57.90
* | R - (erf(x)-x)/x | <= 2
*
*
* Remark. The formula is derived by noting
* erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....)
* and that
* 2/sqrt(pi) = 1.128379167095512573896158903121545171688
* is close to one. The interval is chosen because the fix
* point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is
* near 0.6174), and by some experiment, 0.84375 is chosen to
* guarantee the error is less than one ulp for erf.
*
* 2. For |x| in [0.84375,1.25], let s = |x| - 1, and
* c = 0.84506291151 rounded to single (24 bits)
* erf(x) = sign(x) * (c + P1(s)/Q1(s))
* erfc(x) = (1-c) - P1(s)/Q1(s) if x > 0
* 1+(c+P1(s)/Q1(s)) if x < 0
* |P1/Q1 - (erf(|x|)-c)| <= 2**-59.06
* Remark: here we use the taylor series expansion at x=1.
* erf(1+s) = erf(1) + s*Poly(s)
* = 0.845.. + P1(s)/Q1(s)
* That is, we use rational approximation to approximate
* erf(1+s) - (c = (single)0.84506291151)
* Note that |P1/Q1|< 0.078 for x in [0.84375,1.25]
* where
* P1(s) = degree 6 poly in s
* Q1(s) = degree 6 poly in s
*
* 3. For x in [1.25,1/0.35(~2.857143)],
* erfc(x) = (1/x)*exp(-x*x-0.5625+R1/S1)
* erf(x) = 1 - erfc(x)
* where
* R1(z) = degree 7 poly in z, (z=1/x^2)
* S1(z) = degree 8 poly in z
*
* 4. For x in [1/0.35,28]
* erfc(x) = (1/x)*exp(-x*x-0.5625+R2/S2) if x > 0
* = 2.0 - (1/x)*exp(-x*x-0.5625+R2/S2) if -6<x<0
* = 2.0 - tiny (if x <= -6)
* erf(x) = sign(x)*(1.0 - erfc(x)) if x < 6, else
* erf(x) = sign(x)*(1.0 - tiny)
* where
* R2(z) = degree 6 poly in z, (z=1/x^2)
* S2(z) = degree 7 poly in z
*
* Note1:
* To compute exp(-x*x-0.5625+R/S), let s be a single
* precision number and s := x; then
* -x*x = -s*s + (s-x)*(s+x)
* exp(-x*x-0.5626+R/S) =
* exp(-s*s-0.5625)*exp((s-x)*(s+x)+R/S);
* Note2:
* Here 4 and 5 make use of the asymptotic series
* exp(-x*x)
* erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) )
* x*sqrt(pi)
* We use rational approximation to approximate
* g(s)=f(1/x^2) = log(erfc(x)*x) - x*x + 0.5625
* Here is the error bound for R1/S1 and R2/S2
* |R1/S1 - f(x)| < 2**(-62.57)
* |R2/S2 - f(x)| < 2**(-61.52)
*
* 5. For inf > x >= 28
* erf(x) = sign(x) *(1 - tiny) (raise inexact)
* erfc(x) = tiny*tiny (raise underflow) if x > 0
* = 2 - tiny if x<0
*
* 7. Special case:
* erf(0) = 0, erf(inf) = 1, erf(-inf) = -1,
* erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2,
* erfc/erf(NaN) is NaN
*/
#include "fdlibm.h"
#ifdef __STDC__
static
const
double
#else
static
double
#endif
tiny
=
1e-300
,
half
=
5.00000000000000000000e-01
,
/* 0x3FE00000, 0x00000000 */
one
=
1.00000000000000000000e+00
,
/* 0x3FF00000, 0x00000000 */
two
=
2.00000000000000000000e+00
,
/* 0x40000000, 0x00000000 */
/* c = (float)0.84506291151 */
erx
=
8.45062911510467529297e-01
,
/* 0x3FEB0AC1, 0x60000000 */
/*
* Coefficients for approximation to erf on [0,0.84375]
*/
efx
=
1.28379167095512586316e-01
,
/* 0x3FC06EBA, 0x8214DB69 */
efx8
=
1.02703333676410069053e+00
,
/* 0x3FF06EBA, 0x8214DB69 */
pp0
=
1.28379167095512558561e-01
,
/* 0x3FC06EBA, 0x8214DB68 */
pp1
=
-
3.25042107247001499370e-01
,
/* 0xBFD4CD7D, 0x691CB913 */
pp2
=
-
2.84817495755985104766e-02
,
/* 0xBF9D2A51, 0xDBD7194F */
pp3
=
-
5.77027029648944159157e-03
,
/* 0xBF77A291, 0x236668E4 */
pp4
=
-
2.37630166566501626084e-05
,
/* 0xBEF8EAD6, 0x120016AC */
qq1
=
3.97917223959155352819e-01
,
/* 0x3FD97779, 0xCDDADC09 */
qq2
=
6.50222499887672944485e-02
,
/* 0x3FB0A54C, 0x5536CEBA */
qq3
=
5.08130628187576562776e-03
,
/* 0x3F74D022, 0xC4D36B0F */
qq4
=
1.32494738004321644526e-04
,
/* 0x3F215DC9, 0x221C1A10 */
qq5
=
-
3.96022827877536812320e-06
,
/* 0xBED09C43, 0x42A26120 */
/*
* Coefficients for approximation to erf in [0.84375,1.25]
*/
pa0
=
-
2.36211856075265944077e-03
,
/* 0xBF6359B8, 0xBEF77538 */
pa1
=
4.14856118683748331666e-01
,
/* 0x3FDA8D00, 0xAD92B34D */
pa2
=
-
3.72207876035701323847e-01
,
/* 0xBFD7D240, 0xFBB8C3F1 */
pa3
=
3.18346619901161753674e-01
,
/* 0x3FD45FCA, 0x805120E4 */
pa4
=
-
1.10894694282396677476e-01
,
/* 0xBFBC6398, 0x3D3E28EC */
pa5
=
3.54783043256182359371e-02
,
/* 0x3FA22A36, 0x599795EB */
pa6
=
-
2.16637559486879084300e-03
,
/* 0xBF61BF38, 0x0A96073F */
qa1
=
1.06420880400844228286e-01
,
/* 0x3FBB3E66, 0x18EEE323 */
qa2
=
5.40397917702171048937e-01
,
/* 0x3FE14AF0, 0x92EB6F33 */
qa3
=
7.18286544141962662868e-02
,
/* 0x3FB2635C, 0xD99FE9A7 */
qa4
=
1.26171219808761642112e-01
,
/* 0x3FC02660, 0xE763351F */
qa5
=
1.36370839120290507362e-02
,
/* 0x3F8BEDC2, 0x6B51DD1C */
qa6
=
1.19844998467991074170e-02
,
/* 0x3F888B54, 0x5735151D */
/*
* Coefficients for approximation to erfc in [1.25,1/0.35]
*/
ra0
=
-
9.86494403484714822705e-03
,
/* 0xBF843412, 0x600D6435 */
ra1
=
-
6.93858572707181764372e-01
,
/* 0xBFE63416, 0xE4BA7360 */
ra2
=
-
1.05586262253232909814e+01
,
/* 0xC0251E04, 0x41B0E726 */
ra3
=
-
6.23753324503260060396e+01
,
/* 0xC04F300A, 0xE4CBA38D */
ra4
=
-
1.62396669462573470355e+02
,
/* 0xC0644CB1, 0x84282266 */
ra5
=
-
1.84605092906711035994e+02
,
/* 0xC067135C, 0xEBCCABB2 */
ra6
=
-
8.12874355063065934246e+01
,
/* 0xC0545265, 0x57E4D2F2 */
ra7
=
-
9.81432934416914548592e+00
,
/* 0xC023A0EF, 0xC69AC25C */
sa1
=
1.96512716674392571292e+01
,
/* 0x4033A6B9, 0xBD707687 */
sa2
=
1.37657754143519042600e+02
,
/* 0x4061350C, 0x526AE721 */
sa3
=
4.34565877475229228821e+02
,
/* 0x407B290D, 0xD58A1A71 */
sa4
=
6.45387271733267880336e+02
,
/* 0x40842B19, 0x21EC2868 */
sa5
=
4.29008140027567833386e+02
,
/* 0x407AD021, 0x57700314 */
sa6
=
1.08635005541779435134e+02
,
/* 0x405B28A3, 0xEE48AE2C */
sa7
=
6.57024977031928170135e+00
,
/* 0x401A47EF, 0x8E484A93 */
sa8
=
-
6.04244152148580987438e-02
,
/* 0xBFAEEFF2, 0xEE749A62 */
/*
* Coefficients for approximation to erfc in [1/.35,28]
*/
rb0
=
-
9.86494292470009928597e-03
,
/* 0xBF843412, 0x39E86F4A */
rb1
=
-
7.99283237680523006574e-01
,
/* 0xBFE993BA, 0x70C285DE */
rb2
=
-
1.77579549177547519889e+01
,
/* 0xC031C209, 0x555F995A */
rb3
=
-
1.60636384855821916062e+02
,
/* 0xC064145D, 0x43C5ED98 */
rb4
=
-
6.37566443368389627722e+02
,
/* 0xC083EC88, 0x1375F228 */
rb5
=
-
1.02509513161107724954e+03
,
/* 0xC0900461, 0x6A2E5992 */
rb6
=
-
4.83519191608651397019e+02
,
/* 0xC07E384E, 0x9BDC383F */
sb1
=
3.03380607434824582924e+01
,
/* 0x403E568B, 0x261D5190 */
sb2
=
3.25792512996573918826e+02
,
/* 0x40745CAE, 0x221B9F0A */
sb3
=
1.53672958608443695994e+03
,
/* 0x409802EB, 0x189D5118 */
sb4
=
3.19985821950859553908e+03
,
/* 0x40A8FFB7, 0x688C246A */
sb5
=
2.55305040643316442583e+03
,
/* 0x40A3F219, 0xCEDF3BE6 */
sb6
=
4.74528541206955367215e+02
,
/* 0x407DA874, 0xE79FE763 */
sb7
=
-
2.24409524465858183362e+01
;
/* 0xC03670E2, 0x42712D62 */
#ifdef __STDC__
double
erf
(
double
x
)
#else
double
erf
(
x
)
double
x
;
#endif
{
int
hx
,
ix
,
i
;
double
R
,
S
,
P
,
Q
,
s
,
y
,
z
,
r
;
hx
=
__HI
(
x
);
ix
=
hx
&
0x7fffffff
;
if
(
ix
>=
0x7ff00000
)
{
/* erf(nan)=nan */
i
=
((
unsigned
)
hx
>>
31
)
<<
1
;
return
(
double
)(
1
-
i
)
+
one
/
x
;
/* erf(+-inf)=+-1 */
}
if
(
ix
<
0x3feb0000
)
{
/* |x|<0.84375 */
if
(
ix
<
0x3e300000
)
{
/* |x|<2**-28 */
if
(
ix
<
0x00800000
)
return
0
.
125
*
(
8
.
0
*
x
+
efx8
*
x
);
/*avoid underflow */
return
x
+
efx
*
x
;
}
z
=
x
*
x
;
r
=
pp0
+
z
*
(
pp1
+
z
*
(
pp2
+
z
*
(
pp3
+
z
*
pp4
)));
s
=
one
+
z
*
(
qq1
+
z
*
(
qq2
+
z
*
(
qq3
+
z
*
(
qq4
+
z
*
qq5
))));
y
=
r
/
s
;
return
x
+
x
*
y
;
}
if
(
ix
<
0x3ff40000
)
{
/* 0.84375 <= |x| < 1.25 */
s
=
fabs
(
x
)
-
one
;
P
=
pa0
+
s
*
(
pa1
+
s
*
(
pa2
+
s
*
(
pa3
+
s
*
(
pa4
+
s
*
(
pa5
+
s
*
pa6
)))));
Q
=
one
+
s
*
(
qa1
+
s
*
(
qa2
+
s
*
(
qa3
+
s
*
(
qa4
+
s
*
(
qa5
+
s
*
qa6
)))));
if
(
hx
>=
0
)
return
erx
+
P
/
Q
;
else
return
-
erx
-
P
/
Q
;
}
if
(
ix
>=
0x40180000
)
{
/* inf>|x|>=6 */
if
(
hx
>=
0
)
return
one
-
tiny
;
else
return
tiny
-
one
;
}
x
=
fabs
(
x
);
s
=
one
/
(
x
*
x
);
if
(
ix
<
0x4006DB6E
)
{
/* |x| < 1/0.35 */
R
=
ra0
+
s
*
(
ra1
+
s
*
(
ra2
+
s
*
(
ra3
+
s
*
(
ra4
+
s
*
(
ra5
+
s
*
(
ra6
+
s
*
ra7
))))));
S
=
one
+
s
*
(
sa1
+
s
*
(
sa2
+
s
*
(
sa3
+
s
*
(
sa4
+
s
*
(
sa5
+
s
*
(
sa6
+
s
*
(
sa7
+
s
*
sa8
)))))));
}
else
{
/* |x| >= 1/0.35 */
R
=
rb0
+
s
*
(
rb1
+
s
*
(
rb2
+
s
*
(
rb3
+
s
*
(
rb4
+
s
*
(
rb5
+
s
*
rb6
)))));
S
=
one
+
s
*
(
sb1
+
s
*
(
sb2
+
s
*
(
sb3
+
s
*
(
sb4
+
s
*
(
sb5
+
s
*
(
sb6
+
s
*
sb7
))))));
}
z
=
x
;
__LO
(
z
)
=
0
;
r
=
__ieee754_exp
(
-
z
*
z
-
0
.
5625
)
*
__ieee754_exp
((
z
-
x
)
*
(
z
+
x
)
+
R
/
S
);
if
(
hx
>=
0
)
return
one
-
r
/
x
;
else
return
r
/
x
-
one
;
}
#ifdef __STDC__
double
erfc
(
double
x
)
#else
double
erfc
(
x
)
double
x
;
#endif
{
int
hx
,
ix
;
double
R
,
S
,
P
,
Q
,
s
,
y
,
z
,
r
;
hx
=
__HI
(
x
);
ix
=
hx
&
0x7fffffff
;
if
(
ix
>=
0x7ff00000
)
{
/* erfc(nan)=nan */
/* erfc(+-inf)=0,2 */
return
(
double
)(((
unsigned
)
hx
>>
31
)
<<
1
)
+
one
/
x
;
}
if
(
ix
<
0x3feb0000
)
{
/* |x|<0.84375 */
if
(
ix
<
0x3c700000
)
/* |x|<2**-56 */
return
one
-
x
;
z
=
x
*
x
;
r
=
pp0
+
z
*
(
pp1
+
z
*
(
pp2
+
z
*
(
pp3
+
z
*
pp4
)));
s
=
one
+
z
*
(
qq1
+
z
*
(
qq2
+
z
*
(
qq3
+
z
*
(
qq4
+
z
*
qq5
))));
y
=
r
/
s
;
if
(
hx
<
0x3fd00000
)
{
/* x<1/4 */
return
one
-
(
x
+
x
*
y
);
}
else
{
r
=
x
*
y
;
r
+=
(
x
-
half
);
return
half
-
r
;
}
}
if
(
ix
<
0x3ff40000
)
{
/* 0.84375 <= |x| < 1.25 */
s
=
fabs
(
x
)
-
one
;
P
=
pa0
+
s
*
(
pa1
+
s
*
(
pa2
+
s
*
(
pa3
+
s
*
(
pa4
+
s
*
(
pa5
+
s
*
pa6
)))));
Q
=
one
+
s
*
(
qa1
+
s
*
(
qa2
+
s
*
(
qa3
+
s
*
(
qa4
+
s
*
(
qa5
+
s
*
qa6
)))));
if
(
hx
>=
0
)
{
z
=
one
-
erx
;
return
z
-
P
/
Q
;
}
else
{
z
=
erx
+
P
/
Q
;
return
one
+
z
;
}
}
if
(
ix
<
0x403c0000
)
{
/* |x|<28 */
x
=
fabs
(
x
);
s
=
one
/
(
x
*
x
);
if
(
ix
<
0x4006DB6D
)
{
/* |x| < 1/.35 ~ 2.857143*/
R
=
ra0
+
s
*
(
ra1
+
s
*
(
ra2
+
s
*
(
ra3
+
s
*
(
ra4
+
s
*
(
ra5
+
s
*
(
ra6
+
s
*
ra7
))))));
S
=
one
+
s
*
(
sa1
+
s
*
(
sa2
+
s
*
(
sa3
+
s
*
(
sa4
+
s
*
(
sa5
+
s
*
(
sa6
+
s
*
(
sa7
+
s
*
sa8
)))))));
}
else
{
/* |x| >= 1/.35 ~ 2.857143 */
if
(
hx
<
0
&&
ix
>=
0x40180000
)
return
two
-
tiny
;
/* x < -6 */
R
=
rb0
+
s
*
(
rb1
+
s
*
(
rb2
+
s
*
(
rb3
+
s
*
(
rb4
+
s
*
(
rb5
+
s
*
rb6
)))));
S
=
one
+
s
*
(
sb1
+
s
*
(
sb2
+
s
*
(
sb3
+
s
*
(
sb4
+
s
*
(
sb5
+
s
*
(
sb6
+
s
*
sb7
))))));
}
z
=
x
;
__LO
(
z
)
=
0
;
r
=
__ieee754_exp
(
-
z
*
z
-
0
.
5625
)
*
__ieee754_exp
((
z
-
x
)
*
(
z
+
x
)
+
R
/
S
);
if
(
hx
>
0
)
return
r
/
x
;
else
return
two
-
r
/
x
;
}
else
{
if
(
hx
>
0
)
return
tiny
*
tiny
;
else
return
two
-
tiny
;
}
}
src/share/native/java/lang/fdlibm/src/w_acosh.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* wrapper acosh(x)
*/
#include "fdlibm.h"
#ifdef __STDC__
double
acosh
(
double
x
)
/* wrapper acosh */
#else
double
acosh
(
x
)
/* wrapper acosh */
double
x
;
#endif
{
#ifdef _IEEE_LIBM
return
__ieee754_acosh
(
x
);
#else
double
z
;
z
=
__ieee754_acosh
(
x
);
if
(
_LIB_VERSION
==
_IEEE_
||
isnan
(
x
))
return
z
;
if
(
x
<
1
.
0
)
{
return
__kernel_standard
(
x
,
x
,
29
);
/* acosh(x<1) */
}
else
return
z
;
#endif
}
src/share/native/java/lang/fdlibm/src/w_gamma.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* double gamma(double x)
* Return the logarithm of the Gamma function of x.
*
* Method: call gamma_r
*/
#include "fdlibm.h"
extern
int
signgam
;
#ifdef __STDC__
double
gamma
(
double
x
)
#else
double
gamma
(
x
)
double
x
;
#endif
{
#ifdef _IEEE_LIBM
return
__ieee754_gamma_r
(
x
,
&
signgam
);
#else
double
y
;
y
=
__ieee754_gamma_r
(
x
,
&
signgam
);
if
(
_LIB_VERSION
==
_IEEE_
)
return
y
;
if
(
!
finite
(
y
)
&&
finite
(
x
))
{
if
(
floor
(
x
)
==
x
&&
x
<=
0
.
0
)
return
__kernel_standard
(
x
,
x
,
41
);
/* gamma pole */
else
return
__kernel_standard
(
x
,
x
,
40
);
/* gamma overflow */
}
else
return
y
;
#endif
}
src/share/native/java/lang/fdlibm/src/w_gamma_r.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* wrapper double gamma_r(double x, int *signgamp)
*/
#include "fdlibm.h"
#ifdef __STDC__
double
gamma_r
(
double
x
,
int
*
signgamp
)
/* wrapper lgamma_r */
#else
double
gamma_r
(
x
,
signgamp
)
/* wrapper lgamma_r */
double
x
;
int
*
signgamp
;
#endif
{
#ifdef _IEEE_LIBM
return
__ieee754_gamma_r
(
x
,
signgamp
);
#else
double
y
;
y
=
__ieee754_gamma_r
(
x
,
signgamp
);
if
(
_LIB_VERSION
==
_IEEE_
)
return
y
;
if
(
!
finite
(
y
)
&&
finite
(
x
))
{
if
(
floor
(
x
)
==
x
&&
x
<=
0
.
0
)
return
__kernel_standard
(
x
,
x
,
41
);
/* gamma pole */
else
return
__kernel_standard
(
x
,
x
,
40
);
/* gamma overflow */
}
else
return
y
;
#endif
}
src/share/native/java/lang/fdlibm/src/w_j0.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* wrapper j0(double x), y0(double x)
*/
#include "fdlibm.h"
#ifdef __STDC__
double
j0
(
double
x
)
/* wrapper j0 */
#else
double
j0
(
x
)
/* wrapper j0 */
double
x
;
#endif
{
#ifdef _IEEE_LIBM
return
__ieee754_j0
(
x
);
#else
double
z
=
__ieee754_j0
(
x
);
if
(
_LIB_VERSION
==
_IEEE_
||
isnan
(
x
))
return
z
;
if
(
fabs
(
x
)
>
X_TLOSS
)
{
return
__kernel_standard
(
x
,
x
,
34
);
/* j0(|x|>X_TLOSS) */
}
else
return
z
;
#endif
}
#ifdef __STDC__
double
y0
(
double
x
)
/* wrapper y0 */
#else
double
y0
(
x
)
/* wrapper y0 */
double
x
;
#endif
{
#ifdef _IEEE_LIBM
return
__ieee754_y0
(
x
);
#else
double
z
;
z
=
__ieee754_y0
(
x
);
if
(
_LIB_VERSION
==
_IEEE_
||
isnan
(
x
)
)
return
z
;
if
(
x
<=
0
.
0
){
if
(
x
==
0
.
0
)
/* d= -one/(x-x); */
return
__kernel_standard
(
x
,
x
,
8
);
else
/* d = zero/(x-x); */
return
__kernel_standard
(
x
,
x
,
9
);
}
if
(
x
>
X_TLOSS
)
{
return
__kernel_standard
(
x
,
x
,
35
);
/* y0(x>X_TLOSS) */
}
else
return
z
;
#endif
}
src/share/native/java/lang/fdlibm/src/w_j1.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* wrapper of j1,y1
*/
#include "fdlibm.h"
#ifdef __STDC__
double
j1
(
double
x
)
/* wrapper j1 */
#else
double
j1
(
x
)
/* wrapper j1 */
double
x
;
#endif
{
#ifdef _IEEE_LIBM
return
__ieee754_j1
(
x
);
#else
double
z
;
z
=
__ieee754_j1
(
x
);
if
(
_LIB_VERSION
==
_IEEE_
||
isnan
(
x
)
)
return
z
;
if
(
fabs
(
x
)
>
X_TLOSS
)
{
return
__kernel_standard
(
x
,
x
,
36
);
/* j1(|x|>X_TLOSS) */
}
else
return
z
;
#endif
}
#ifdef __STDC__
double
y1
(
double
x
)
/* wrapper y1 */
#else
double
y1
(
x
)
/* wrapper y1 */
double
x
;
#endif
{
#ifdef _IEEE_LIBM
return
__ieee754_y1
(
x
);
#else
double
z
;
z
=
__ieee754_y1
(
x
);
if
(
_LIB_VERSION
==
_IEEE_
||
isnan
(
x
)
)
return
z
;
if
(
x
<=
0
.
0
){
if
(
x
==
0
.
0
)
/* d= -one/(x-x); */
return
__kernel_standard
(
x
,
x
,
10
);
else
/* d = zero/(x-x); */
return
__kernel_standard
(
x
,
x
,
11
);
}
if
(
x
>
X_TLOSS
)
{
return
__kernel_standard
(
x
,
x
,
37
);
/* y1(x>X_TLOSS) */
}
else
return
z
;
#endif
}
src/share/native/java/lang/fdlibm/src/w_jn.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* wrapper jn(int n, double x), yn(int n, double x)
* floating point Bessel's function of the 1st and 2nd kind
* of order n
*
* Special cases:
* y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
* y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
* Note 2. About jn(n,x), yn(n,x)
* For n=0, j0(x) is called,
* for n=1, j1(x) is called,
* for n<x, forward recursion us used starting
* from values of j0(x) and j1(x).
* for n>x, a continued fraction approximation to
* j(n,x)/j(n-1,x) is evaluated and then backward
* recursion is used starting from a supposed value
* for j(n,x). The resulting value of j(0,x) is
* compared with the actual value to correct the
* supposed value of j(n,x).
*
* yn(n,x) is similar in all respects, except
* that forward recursion is used for all
* values of n>1.
*
*/
#include "fdlibm.h"
#ifdef __STDC__
double
jn
(
int
n
,
double
x
)
/* wrapper jn */
#else
double
jn
(
n
,
x
)
/* wrapper jn */
double
x
;
int
n
;
#endif
{
#ifdef _IEEE_LIBM
return
__ieee754_jn
(
n
,
x
);
#else
double
z
;
z
=
__ieee754_jn
(
n
,
x
);
if
(
_LIB_VERSION
==
_IEEE_
||
isnan
(
x
)
)
return
z
;
if
(
fabs
(
x
)
>
X_TLOSS
)
{
return
__kernel_standard
((
double
)
n
,
x
,
38
);
/* jn(|x|>X_TLOSS,n) */
}
else
return
z
;
#endif
}
#ifdef __STDC__
double
yn
(
int
n
,
double
x
)
/* wrapper yn */
#else
double
yn
(
n
,
x
)
/* wrapper yn */
double
x
;
int
n
;
#endif
{
#ifdef _IEEE_LIBM
return
__ieee754_yn
(
n
,
x
);
#else
double
z
;
z
=
__ieee754_yn
(
n
,
x
);
if
(
_LIB_VERSION
==
_IEEE_
||
isnan
(
x
)
)
return
z
;
if
(
x
<=
0
.
0
){
if
(
x
==
0
.
0
)
/* d= -one/(x-x); */
return
__kernel_standard
((
double
)
n
,
x
,
12
);
else
/* d = zero/(x-x); */
return
__kernel_standard
((
double
)
n
,
x
,
13
);
}
if
(
x
>
X_TLOSS
)
{
return
__kernel_standard
((
double
)
n
,
x
,
39
);
/* yn(x>X_TLOSS,n) */
}
else
return
z
;
#endif
}
src/share/native/java/lang/fdlibm/src/w_lgamma.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* double lgamma(double x)
* Return the logarithm of the Gamma function of x.
*
* Method: call __ieee754_lgamma_r
*/
#include "fdlibm.h"
extern
int
signgam
;
#ifdef __STDC__
double
lgamma
(
double
x
)
#else
double
lgamma
(
x
)
double
x
;
#endif
{
#ifdef _IEEE_LIBM
return
__ieee754_lgamma_r
(
x
,
&
signgam
);
#else
double
y
;
y
=
__ieee754_lgamma_r
(
x
,
&
signgam
);
if
(
_LIB_VERSION
==
_IEEE_
)
return
y
;
if
(
!
finite
(
y
)
&&
finite
(
x
))
{
if
(
floor
(
x
)
==
x
&&
x
<=
0
.
0
)
return
__kernel_standard
(
x
,
x
,
15
);
/* lgamma pole */
else
return
__kernel_standard
(
x
,
x
,
14
);
/* lgamma overflow */
}
else
return
y
;
#endif
}
src/share/native/java/lang/fdlibm/src/w_lgamma_r.c
已删除
100644 → 0
浏览文件 @
1de3ffb3
/*
* Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* wrapper double lgamma_r(double x, int *signgamp)
*/
#include "fdlibm.h"
#ifdef __STDC__
double
lgamma_r
(
double
x
,
int
*
signgamp
)
/* wrapper lgamma_r */
#else
double
lgamma_r
(
x
,
signgamp
)
/* wrapper lgamma_r */
double
x
;
int
*
signgamp
;
#endif
{
#ifdef _IEEE_LIBM
return
__ieee754_lgamma_r
(
x
,
signgamp
);
#else
double
y
;
y
=
__ieee754_lgamma_r
(
x
,
signgamp
);
if
(
_LIB_VERSION
==
_IEEE_
)
return
y
;
if
(
!
finite
(
y
)
&&
finite
(
x
))
{
if
(
floor
(
x
)
==
x
&&
x
<=
0
.
0
)
return
__kernel_standard
(
x
,
x
,
15
);
/* lgamma pole */
else
return
__kernel_standard
(
x
,
x
,
14
);
/* lgamma overflow */
}
else
return
y
;
#endif
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录