Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
bfc3a2bd
Commit
bfc3a2bd
authored
Mar 30, 2023
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
msvcrt: Use the erf()/erfc()/erff()/erfcf() implementation from the bundled musl library.
parent
3b1e2a7b
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
8 additions
and
371 deletions
+8
-371
math.c
dlls/msvcrt/math.c
+0
-369
erf.c
libs/musl/src/math/erf.c
+4
-1
erff.c
libs/musl/src/math/erff.c
+4
-1
No files found.
dlls/msvcrt/math.c
View file @
bfc3a2bd
...
...
@@ -77,15 +77,6 @@ void msvcrt_init_math( void *module )
#endif
}
/* Copied from musl: src/internal/libm.h */
#if _MSVCR_VER >= 120
static
inline
double
fp_barrier
(
double
x
)
{
volatile
double
y
=
x
;
return
y
;
}
#endif
static
inline
double
ret_nan
(
BOOL
update_sw
)
{
double
x
=
1
.
0
;
...
...
@@ -2874,365 +2865,6 @@ short CDECL _fdtest(float *x)
return
_fdclass
(
*
x
);
}
static
double
erfc1
(
double
x
)
{
static
const
double
erx
=
8.45062911510467529297e-01
,
pa0
=
-
2.36211856075265944077e-03
,
pa1
=
4.14856118683748331666e-01
,
pa2
=
-
3.72207876035701323847e-01
,
pa3
=
3.18346619901161753674e-01
,
pa4
=
-
1.10894694282396677476e-01
,
pa5
=
3.54783043256182359371e-02
,
pa6
=
-
2.16637559486879084300e-03
,
qa1
=
1.06420880400844228286e-01
,
qa2
=
5.40397917702171048937e-01
,
qa3
=
7.18286544141962662868e-02
,
qa4
=
1.26171219808761642112e-01
,
qa5
=
1.36370839120290507362e-02
,
qa6
=
1.19844998467991074170e-02
;
double
s
,
P
,
Q
;
s
=
fabs
(
x
)
-
1
;
P
=
pa0
+
s
*
(
pa1
+
s
*
(
pa2
+
s
*
(
pa3
+
s
*
(
pa4
+
s
*
(
pa5
+
s
*
pa6
)))));
Q
=
1
+
s
*
(
qa1
+
s
*
(
qa2
+
s
*
(
qa3
+
s
*
(
qa4
+
s
*
(
qa5
+
s
*
qa6
)))));
return
1
-
erx
-
P
/
Q
;
}
static
double
erfc2
(
UINT32
ix
,
double
x
)
{
static
const
double
ra0
=
-
9.86494403484714822705e-03
,
ra1
=
-
6.93858572707181764372e-01
,
ra2
=
-
1.05586262253232909814e+01
,
ra3
=
-
6.23753324503260060396e+01
,
ra4
=
-
1.62396669462573470355e+02
,
ra5
=
-
1.84605092906711035994e+02
,
ra6
=
-
8.12874355063065934246e+01
,
ra7
=
-
9.81432934416914548592e+00
,
sa1
=
1.96512716674392571292e+01
,
sa2
=
1.37657754143519042600e+02
,
sa3
=
4.34565877475229228821e+02
,
sa4
=
6.45387271733267880336e+02
,
sa5
=
4.29008140027567833386e+02
,
sa6
=
1.08635005541779435134e+02
,
sa7
=
6.57024977031928170135e+00
,
sa8
=
-
6.04244152148580987438e-02
,
rb0
=
-
9.86494292470009928597e-03
,
rb1
=
-
7.99283237680523006574e-01
,
rb2
=
-
1.77579549177547519889e+01
,
rb3
=
-
1.60636384855821916062e+02
,
rb4
=
-
6.37566443368389627722e+02
,
rb5
=
-
1.02509513161107724954e+03
,
rb6
=
-
4.83519191608651397019e+02
,
sb1
=
3.03380607434824582924e+01
,
sb2
=
3.25792512996573918826e+02
,
sb3
=
1.53672958608443695994e+03
,
sb4
=
3.19985821950859553908e+03
,
sb5
=
2.55305040643316442583e+03
,
sb6
=
4.74528541206955367215e+02
,
sb7
=
-
2.24409524465858183362e+01
;
double
s
,
R
,
S
,
z
;
UINT64
iz
;
if
(
ix
<
0x3ff40000
)
/* |x| < 1.25 */
return
erfc1
(
x
);
x
=
fabs
(
x
);
s
=
1
/
(
x
*
x
);
if
(
ix
<
0x4006db6d
)
{
/* |x| < 1/.35 ~ 2.85714 */
R
=
ra0
+
s
*
(
ra1
+
s
*
(
ra2
+
s
*
(
ra3
+
s
*
(
ra4
+
s
*
(
ra5
+
s
*
(
ra6
+
s
*
ra7
))))));
S
=
1
.
0
+
s
*
(
sa1
+
s
*
(
sa2
+
s
*
(
sa3
+
s
*
(
sa4
+
s
*
(
sa5
+
s
*
(
sa6
+
s
*
(
sa7
+
s
*
sa8
)))))));
}
else
{
/* |x| > 1/.35 */
R
=
rb0
+
s
*
(
rb1
+
s
*
(
rb2
+
s
*
(
rb3
+
s
*
(
rb4
+
s
*
(
rb5
+
s
*
rb6
)))));
S
=
1
.
0
+
s
*
(
sb1
+
s
*
(
sb2
+
s
*
(
sb3
+
s
*
(
sb4
+
s
*
(
sb5
+
s
*
(
sb6
+
s
*
sb7
))))));
}
z
=
x
;
iz
=
*
(
ULONGLONG
*
)
&
z
;
iz
&=
0xffffffff00000000ULL
;
z
=
*
(
double
*
)
&
iz
;
return
exp
(
-
z
*
z
-
0
.
5625
)
*
exp
((
z
-
x
)
*
(
z
+
x
)
+
R
/
S
)
/
x
;
}
/*********************************************************************
* erf (MSVCR120.@)
*/
double
CDECL
erf
(
double
x
)
{
static
const
double
efx8
=
1.02703333676410069053e+00
,
pp0
=
1.28379167095512558561e-01
,
pp1
=
-
3.25042107247001499370e-01
,
pp2
=
-
2.84817495755985104766e-02
,
pp3
=
-
5.77027029648944159157e-03
,
pp4
=
-
2.37630166566501626084e-05
,
qq1
=
3.97917223959155352819e-01
,
qq2
=
6.50222499887672944485e-02
,
qq3
=
5.08130628187576562776e-03
,
qq4
=
1.32494738004321644526e-04
,
qq5
=
-
3.96022827877536812320e-06
;
double
r
,
s
,
z
,
y
;
UINT32
ix
;
int
sign
;
ix
=
*
(
UINT64
*
)
&
x
>>
32
;
sign
=
ix
>>
31
;
ix
&=
0x7fffffff
;
if
(
ix
>=
0x7ff00000
)
{
/* erf(nan)=nan, erf(+-inf)=+-1 */
return
1
-
2
*
sign
+
1
/
x
;
}
if
(
ix
<
0x3feb0000
)
{
/* |x| < 0.84375 */
if
(
ix
<
0x3e300000
)
{
/* |x| < 2**-28 */
/* avoid underflow */
return
0
.
125
*
(
8
*
x
+
efx8
*
x
);
}
z
=
x
*
x
;
r
=
pp0
+
z
*
(
pp1
+
z
*
(
pp2
+
z
*
(
pp3
+
z
*
pp4
)));
s
=
1
.
0
+
z
*
(
qq1
+
z
*
(
qq2
+
z
*
(
qq3
+
z
*
(
qq4
+
z
*
qq5
))));
y
=
r
/
s
;
return
x
+
x
*
y
;
}
if
(
ix
<
0x40180000
)
/* 0.84375 <= |x| < 6 */
y
=
1
-
erfc2
(
ix
,
x
);
else
y
=
1
-
DBL_MIN
;
return
sign
?
-
y
:
y
;
}
static
float
erfc1f
(
float
x
)
{
static
const
float
erx
=
8.4506291151e-01
,
pa0
=
-
2.3621185683e-03
,
pa1
=
4.1485610604e-01
,
pa2
=
-
3.7220788002e-01
,
pa3
=
3.1834661961e-01
,
pa4
=
-
1.1089469492e-01
,
pa5
=
3.5478305072e-02
,
pa6
=
-
2.1663755178e-03
,
qa1
=
1.0642088205e-01
,
qa2
=
5.4039794207e-01
,
qa3
=
7.1828655899e-02
,
qa4
=
1.2617121637e-01
,
qa5
=
1.3637083583e-02
,
qa6
=
1.1984500103e-02
;
float
s
,
P
,
Q
;
s
=
fabsf
(
x
)
-
1
;
P
=
pa0
+
s
*
(
pa1
+
s
*
(
pa2
+
s
*
(
pa3
+
s
*
(
pa4
+
s
*
(
pa5
+
s
*
pa6
)))));
Q
=
1
+
s
*
(
qa1
+
s
*
(
qa2
+
s
*
(
qa3
+
s
*
(
qa4
+
s
*
(
qa5
+
s
*
qa6
)))));
return
1
-
erx
-
P
/
Q
;
}
static
float
erfc2f
(
UINT32
ix
,
float
x
)
{
static
const
float
ra0
=
-
9.8649440333e-03
,
ra1
=
-
6.9385856390e-01
,
ra2
=
-
1.0558626175e+01
,
ra3
=
-
6.2375331879e+01
,
ra4
=
-
1.6239666748e+02
,
ra5
=
-
1.8460508728e+02
,
ra6
=
-
8.1287437439e+01
,
ra7
=
-
9.8143291473e+00
,
sa1
=
1.9651271820e+01
,
sa2
=
1.3765776062e+02
,
sa3
=
4.3456588745e+02
,
sa4
=
6.4538726807e+02
,
sa5
=
4.2900814819e+02
,
sa6
=
1.0863500214e+02
,
sa7
=
6.5702495575e+00
,
sa8
=
-
6.0424413532e-02
,
rb0
=
-
9.8649431020e-03
,
rb1
=
-
7.9928326607e-01
,
rb2
=
-
1.7757955551e+01
,
rb3
=
-
1.6063638306e+02
,
rb4
=
-
6.3756646729e+02
,
rb5
=
-
1.0250950928e+03
,
rb6
=
-
4.8351919556e+02
,
sb1
=
3.0338060379e+01
,
sb2
=
3.2579251099e+02
,
sb3
=
1.5367296143e+03
,
sb4
=
3.1998581543e+03
,
sb5
=
2.5530502930e+03
,
sb6
=
4.7452853394e+02
,
sb7
=
-
2.2440952301e+01
;
float
s
,
R
,
S
,
z
;
if
(
ix
<
0x3fa00000
)
/* |x| < 1.25 */
return
erfc1f
(
x
);
x
=
fabsf
(
x
);
s
=
1
/
(
x
*
x
);
if
(
ix
<
0x4036db6d
)
{
/* |x| < 1/0.35 */
R
=
ra0
+
s
*
(
ra1
+
s
*
(
ra2
+
s
*
(
ra3
+
s
*
(
ra4
+
s
*
(
ra5
+
s
*
(
ra6
+
s
*
ra7
))))));
S
=
1
.
0
f
+
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
=
1
.
0
f
+
s
*
(
sb1
+
s
*
(
sb2
+
s
*
(
sb3
+
s
*
(
sb4
+
s
*
(
sb5
+
s
*
(
sb6
+
s
*
sb7
))))));
}
ix
=
*
(
UINT32
*
)
&
x
&
0xffffe000
;
z
=
*
(
float
*
)
&
ix
;
return
expf
(
-
z
*
z
-
0
.
5625
f
)
*
expf
((
z
-
x
)
*
(
z
+
x
)
+
R
/
S
)
/
x
;
}
/*********************************************************************
* erff (MSVCR120.@)
*
* Copied from musl: src/math/erff.c
*/
float
CDECL
erff
(
float
x
)
{
static
const
float
efx8
=
1.0270333290e+00
,
pp0
=
1.2837916613e-01
,
pp1
=
-
3.2504209876e-01
,
pp2
=
-
2.8481749818e-02
,
pp3
=
-
5.7702702470e-03
,
pp4
=
-
2.3763017452e-05
,
qq1
=
3.9791721106e-01
,
qq2
=
6.5022252500e-02
,
qq3
=
5.0813062117e-03
,
qq4
=
1.3249473704e-04
,
qq5
=
-
3.9602282413e-06
;
float
r
,
s
,
z
,
y
;
UINT32
ix
;
int
sign
;
ix
=
*
(
UINT32
*
)
&
x
;
sign
=
ix
>>
31
;
ix
&=
0x7fffffff
;
if
(
ix
>=
0x7f800000
)
{
/* erf(nan)=nan, erf(+-inf)=+-1 */
return
1
-
2
*
sign
+
1
/
x
;
}
if
(
ix
<
0x3f580000
)
{
/* |x| < 0.84375 */
if
(
ix
<
0x31800000
)
{
/* |x| < 2**-28 */
/*avoid underflow */
return
0
.
125
f
*
(
8
*
x
+
efx8
*
x
);
}
z
=
x
*
x
;
r
=
pp0
+
z
*
(
pp1
+
z
*
(
pp2
+
z
*
(
pp3
+
z
*
pp4
)));
s
=
1
+
z
*
(
qq1
+
z
*
(
qq2
+
z
*
(
qq3
+
z
*
(
qq4
+
z
*
qq5
))));
y
=
r
/
s
;
return
x
+
x
*
y
;
}
if
(
ix
<
0x40c00000
)
/* |x| < 6 */
y
=
1
-
erfc2f
(
ix
,
x
);
else
y
=
1
-
FLT_MIN
;
return
sign
?
-
y
:
y
;
}
/*********************************************************************
* erfc (MSVCR120.@)
*
* Copied from musl: src/math/erf.c
*/
double
CDECL
erfc
(
double
x
)
{
static
const
double
pp0
=
1.28379167095512558561e-01
,
pp1
=
-
3.25042107247001499370e-01
,
pp2
=
-
2.84817495755985104766e-02
,
pp3
=
-
5.77027029648944159157e-03
,
pp4
=
-
2.37630166566501626084e-05
,
qq1
=
3.97917223959155352819e-01
,
qq2
=
6.50222499887672944485e-02
,
qq3
=
5.08130628187576562776e-03
,
qq4
=
1.32494738004321644526e-04
,
qq5
=
-
3.96022827877536812320e-06
;
double
r
,
s
,
z
,
y
;
UINT32
ix
;
int
sign
;
ix
=
*
(
ULONGLONG
*
)
&
x
>>
32
;
sign
=
ix
>>
31
;
ix
&=
0x7fffffff
;
if
(
ix
>=
0x7ff00000
)
{
/* erfc(nan)=nan, erfc(+-inf)=0,2 */
return
2
*
sign
+
1
/
x
;
}
if
(
ix
<
0x3feb0000
)
{
/* |x| < 0.84375 */
if
(
ix
<
0x3c700000
)
/* |x| < 2**-56 */
return
1
.
0
-
x
;
z
=
x
*
x
;
r
=
pp0
+
z
*
(
pp1
+
z
*
(
pp2
+
z
*
(
pp3
+
z
*
pp4
)));
s
=
1
.
0
+
z
*
(
qq1
+
z
*
(
qq2
+
z
*
(
qq3
+
z
*
(
qq4
+
z
*
qq5
))));
y
=
r
/
s
;
if
(
sign
||
ix
<
0x3fd00000
)
{
/* x < 1/4 */
return
1
.
0
-
(
x
+
x
*
y
);
}
return
0
.
5
-
(
x
-
0
.
5
+
x
*
y
);
}
if
(
ix
<
0x403c0000
)
{
/* 0.84375 <= |x| < 28 */
return
sign
?
2
-
erfc2
(
ix
,
x
)
:
erfc2
(
ix
,
x
);
}
if
(
sign
)
return
2
-
DBL_MIN
;
*
_errno
()
=
ERANGE
;
return
fp_barrier
(
DBL_MIN
)
*
DBL_MIN
;
}
/*********************************************************************
* erfcf (MSVCR120.@)
*
* Copied from musl: src/math/erff.c
*/
float
CDECL
erfcf
(
float
x
)
{
static
const
float
pp0
=
1.2837916613e-01
,
pp1
=
-
3.2504209876e-01
,
pp2
=
-
2.8481749818e-02
,
pp3
=
-
5.7702702470e-03
,
pp4
=
-
2.3763017452e-05
,
qq1
=
3.9791721106e-01
,
qq2
=
6.5022252500e-02
,
qq3
=
5.0813062117e-03
,
qq4
=
1.3249473704e-04
,
qq5
=
-
3.9602282413e-06
;
float
r
,
s
,
z
,
y
;
UINT32
ix
;
int
sign
;
ix
=
*
(
UINT32
*
)
&
x
;
sign
=
ix
>>
31
;
ix
&=
0x7fffffff
;
if
(
ix
>=
0x7f800000
)
{
/* erfc(nan)=nan, erfc(+-inf)=0,2 */
return
2
*
sign
+
1
/
x
;
}
if
(
ix
<
0x3f580000
)
{
/* |x| < 0.84375 */
if
(
ix
<
0x23800000
)
/* |x| < 2**-56 */
return
1
.
0
f
-
x
;
z
=
x
*
x
;
r
=
pp0
+
z
*
(
pp1
+
z
*
(
pp2
+
z
*
(
pp3
+
z
*
pp4
)));
s
=
1
.
0
f
+
z
*
(
qq1
+
z
*
(
qq2
+
z
*
(
qq3
+
z
*
(
qq4
+
z
*
qq5
))));
y
=
r
/
s
;
if
(
sign
||
ix
<
0x3e800000
)
/* x < 1/4 */
return
1
.
0
f
-
(
x
+
x
*
y
);
return
0
.
5
f
-
(
x
-
0
.
5
f
+
x
*
y
);
}
if
(
ix
<
0x41e00000
)
{
/* |x| < 28 */
return
sign
?
2
-
erfc2f
(
ix
,
x
)
:
erfc2f
(
ix
,
x
);
}
if
(
sign
)
return
2
-
FLT_MIN
;
*
_errno
()
=
ERANGE
;
return
FLT_MIN
*
FLT_MIN
;
}
/*********************************************************************
* _fdsign (MSVCR120.@)
*/
...
...
@@ -3251,7 +2883,6 @@ int CDECL _dsign(double x)
return
(
u
.
i
>>
48
)
&
0x8000
;
}
/*********************************************************************
* _dpcomp (MSVCR120.@)
*/
...
...
libs/musl/src/math/erf.c
View file @
bfc3a2bd
...
...
@@ -269,5 +269,8 @@ double __cdecl erfc(double x)
if
(
ix
<
0x403c0000
)
{
/* 0.84375 <= |x| < 28 */
return
sign
?
2
-
erfc2
(
ix
,
x
)
:
erfc2
(
ix
,
x
);
}
return
sign
?
2
-
0x1
p
-
1022
:
0x1
p
-
1022
*
0x1
p
-
1022
;
if
(
sign
)
return
2
-
DBL_MIN
;
errno
=
ERANGE
;
return
fp_barrier
(
DBL_MIN
)
*
DBL_MIN
;
}
libs/musl/src/math/erff.c
View file @
bfc3a2bd
...
...
@@ -179,5 +179,8 @@ float __cdecl erfcf(float x)
if
(
ix
<
0x41e00000
)
{
/* |x| < 28 */
return
sign
?
2
-
erfc2
(
ix
,
x
)
:
erfc2
(
ix
,
x
);
}
return
sign
?
2
-
0x1
p
-
120
f
:
0x1
p
-
120
f
*
0x1
p
-
120
f
;
if
(
sign
)
return
2
-
FLT_MIN
;
errno
=
ERANGE
;
return
FLT_MIN
*
FLT_MIN
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment