Signed-off-by: Alex Henrie alexhenrie24@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; }