Commit 505e5a16 authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

msvcrt: Improved _wcstod_l precision.

parent a3035679
...@@ -202,7 +202,8 @@ double CDECL MSVCRT__wcstod_l(const MSVCRT_wchar_t* str, MSVCRT_wchar_t** end, ...@@ -202,7 +202,8 @@ double CDECL MSVCRT__wcstod_l(const MSVCRT_wchar_t* str, MSVCRT_wchar_t** end,
int exp=0, sign=1; int exp=0, sign=1;
const MSVCRT_wchar_t *p; const MSVCRT_wchar_t *p;
double ret; double ret;
BOOL found_digit = FALSE; long double lret=1, expcnt = 10;
BOOL found_digit = FALSE, negexp;
if (!MSVCRT_CHECK_PMT(str != NULL)) return 0; if (!MSVCRT_CHECK_PMT(str != NULL)) return 0;
...@@ -287,10 +288,16 @@ double CDECL MSVCRT__wcstod_l(const MSVCRT_wchar_t* str, MSVCRT_wchar_t** end, ...@@ -287,10 +288,16 @@ double CDECL MSVCRT__wcstod_l(const MSVCRT_wchar_t* str, MSVCRT_wchar_t** end,
_control87(MSVCRT__EM_DENORMAL|MSVCRT__EM_INVALID|MSVCRT__EM_ZERODIVIDE _control87(MSVCRT__EM_DENORMAL|MSVCRT__EM_INVALID|MSVCRT__EM_ZERODIVIDE
|MSVCRT__EM_OVERFLOW|MSVCRT__EM_UNDERFLOW|MSVCRT__EM_INEXACT, 0xffffffff); |MSVCRT__EM_OVERFLOW|MSVCRT__EM_UNDERFLOW|MSVCRT__EM_INEXACT, 0xffffffff);
if(exp>0) negexp = (exp < 0);
ret = (double)sign*d*pow(10, exp); if(negexp)
else exp = -exp;
ret = (double)sign*d/pow(10, -exp); while(exp) {
if(exp & 1)
lret *= expcnt;
exp /= 2;
expcnt = expcnt*expcnt;
}
ret = (long double)sign * (negexp ? d/lret : d*lret);
_control87(fpcontrol, 0xffffffff); _control87(fpcontrol, 0xffffffff);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment