[PATCH v2] msvcrt: Add fallback implementations for Bessel functions
Alex Henrie
alexhenrie24 at gmail.com
Fri Mar 2 09:48:19 CST 2018
Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
Fixes https://bugs.winehq.org/show_bug.cgi?id=37809
v2:
- Dropped inaccurate fallbacks for jn, y0, y1, and yn
- Avoided division by 0 in fallbacks for j0 and j1
configure.ac | 8 +++++++-
dlls/msvcrt/math.c | 32 ++++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index 2e99320371..e198018427 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2698,6 +2698,9 @@ AC_CHECK_FUNCS(\
exp2f \
expm1 \
expm1f \
+ j0 \
+ j1 \
+ jn \
lgamma \
lgammaf \
llrint \
@@ -2722,7 +2725,10 @@ AC_CHECK_FUNCS(\
round \
roundf \
trunc \
- truncf
+ truncf \
+ y0 \
+ y1 \
+ yn
)
LIBS="$ac_save_LIBS"
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index 9b480117fc..4fd1fc28ed 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -1412,7 +1412,12 @@ INT CDECL MSVCRT__isnan(double num)
double CDECL MSVCRT__j0(double num)
{
/* FIXME: errno handling */
+#ifdef HAVE_J0
return j0(num);
+#else
+ if (num == 0) return 1;
+ return sin(num) / num;
+#endif
}
/*********************************************************************
@@ -1421,7 +1426,12 @@ double CDECL MSVCRT__j0(double num)
double CDECL MSVCRT__j1(double num)
{
/* FIXME: errno handling */
+#ifdef HAVE_J1
return j1(num);
+#else
+ if (num == 0) return 0;
+ return sin(num) / (num * num) - cos(num) / num;
+#endif
}
/*********************************************************************
@@ -1430,7 +1440,14 @@ double CDECL MSVCRT__j1(double num)
double CDECL MSVCRT__jn(int n, double num)
{
/* FIXME: errno handling */
+#ifdef HAVE_JN
return jn(n, num);
+#else
+ if (n == 0) return MSVCRT__j0(num);
+ if (n == 1) return MSVCRT__j1(num);
+ FIXME( "not implemented\n" );
+ return 0;
+#endif
}
/*********************************************************************
@@ -1440,12 +1457,17 @@ double CDECL MSVCRT__y0(double num)
{
double retval;
if (!isfinite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
+#ifdef HAVE_Y0
retval = y0(num);
if (MSVCRT__fpclass(retval) == MSVCRT__FPCLASS_NINF)
{
*MSVCRT__errno() = MSVCRT_EDOM;
retval = sqrt(-1);
}
+#else
+ FIXME( "not implemented\n" );
+ retval = 0;
+#endif
return retval;
}
@@ -1456,12 +1478,17 @@ double CDECL MSVCRT__y1(double num)
{
double retval;
if (!isfinite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
+#ifdef HAVE_Y1
retval = y1(num);
if (MSVCRT__fpclass(retval) == MSVCRT__FPCLASS_NINF)
{
*MSVCRT__errno() = MSVCRT_EDOM;
retval = sqrt(-1);
}
+#else
+ FIXME( "not implemented\n" );
+ retval = 0;
+#endif
return retval;
}
@@ -1472,12 +1499,17 @@ double CDECL MSVCRT__yn(int order, double num)
{
double retval;
if (!isfinite(num)) *MSVCRT__errno() = MSVCRT_EDOM;
+#ifdef HAVE_YN
retval = yn(order,num);
if (MSVCRT__fpclass(retval) == MSVCRT__FPCLASS_NINF)
{
*MSVCRT__errno() = MSVCRT_EDOM;
retval = sqrt(-1);
}
+#else
+ FIXME( "not implemented\n" );
+ retval = 0;
+#endif
return retval;
}
--
2.16.2
More information about the wine-devel
mailing list