Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
3171dccb
Commit
3171dccb
authored
May 29, 2021
by
Piotr Caban
Committed by
Alexandre Julliard
May 31, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
msvcrt: Import tanh implementation from musl.
Signed-off-by:
Piotr Caban
<
piotr@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
ae48d583
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
41 additions
and
13 deletions
+41
-13
math.c
dlls/msvcrt/math.c
+41
-3
unixlib.c
dlls/msvcrt/unixlib.c
+0
-9
unixlib.h
dlls/msvcrt/unixlib.h
+0
-1
No files found.
dlls/msvcrt/math.c
View file @
3171dccb
...
...
@@ -2834,9 +2834,47 @@ double CDECL tan( double x )
*/
double
CDECL
tanh
(
double
x
)
{
double
ret
=
unix_funcs
->
tanh
(
x
);
if
(
isnan
(
x
))
return
math_error
(
_DOMAIN
,
"tanh"
,
x
,
0
,
ret
);
return
ret
;
UINT64
ui
=
*
(
UINT64
*
)
&
x
;
UINT32
w
;
int
sign
;
double
t
;
/* x = |x| */
sign
=
ui
>>
63
;
ui
&=
(
UINT64
)
-
1
/
2
;
x
=
*
(
double
*
)
&
ui
;
w
=
ui
>>
32
;
if
(
w
>
0x3fe193ea
)
{
/* |x| > log(3)/2 ~= 0.5493 or nan */
if
(
w
>
0x40340000
)
{
#if _MSVCR_VER < 140
if
(
isnan
(
x
))
return
math_error
(
_DOMAIN
,
"tanh"
,
x
,
0
,
x
);
#endif
/* |x| > 20 or nan */
/* note: this branch avoids raising overflow */
fp_barrier
(
x
+
0x1
p120f
);
t
=
1
-
0
/
x
;
}
else
{
t
=
__expm1
(
2
*
x
);
t
=
1
-
2
/
(
t
+
2
);
}
}
else
if
(
w
>
0x3fd058ae
)
{
/* |x| > log(5/3)/2 ~= 0.2554 */
t
=
__expm1
(
2
*
x
);
t
=
t
/
(
t
+
2
);
}
else
if
(
w
>=
0x00100000
)
{
/* |x| >= 0x1p-1022, up to 2ulp error in [0.1,0.2554] */
t
=
__expm1
(
-
2
*
x
);
t
=
-
t
/
(
t
+
2
);
}
else
{
/* |x| is subnormal */
/* note: the branch above would not raise underflow in [0x1p-1023,0x1p-1022) */
fp_barrier
((
float
)
x
);
t
=
x
;
}
return
sign
?
-
t
:
t
;
}
...
...
dlls/msvcrt/unixlib.c
View file @
3171dccb
...
...
@@ -269,14 +269,6 @@ static float CDECL unix_powf( float x, float y )
}
/*********************************************************************
* tanh
*/
static
double
CDECL
unix_tanh
(
double
x
)
{
return
tanh
(
x
);
}
/*********************************************************************
* tanhf
*/
static
float
CDECL
unix_tanhf
(
float
x
)
...
...
@@ -335,7 +327,6 @@ static const struct unix_funcs funcs =
unix_log2f
,
unix_pow
,
unix_powf
,
unix_tanh
,
unix_tanhf
,
unix_tgamma
,
unix_tgammaf
,
...
...
dlls/msvcrt/unixlib.h
View file @
3171dccb
...
...
@@ -46,7 +46,6 @@ struct unix_funcs
float
(
CDECL
*
log2f
)(
float
x
);
double
(
CDECL
*
pow
)(
double
x
,
double
y
);
float
(
CDECL
*
powf
)(
float
x
,
float
y
);
double
(
CDECL
*
tanh
)(
double
x
);
float
(
CDECL
*
tanhf
)(
float
x
);
double
(
CDECL
*
tgamma
)(
double
x
);
float
(
CDECL
*
tgammaf
)(
float
x
);
...
...
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