Module: wine Branch: master Commit: cbb94b1fcc73f50d1ec00121cb86060ab44b5bb8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cbb94b1fcc73f50d1ec00121cb...
Author: Piotr Caban piotr@codeweavers.com Date: Tue Nov 6 10:33:51 2012 +0100
msvcrt: Improved strtod_l precision.
---
dlls/msvcrt/string.c | 17 ++++++++++++----- 1 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c index 2a6a8ca..ad33f6a 100644 --- a/dlls/msvcrt/string.c +++ b/dlls/msvcrt/string.c @@ -291,7 +291,8 @@ double CDECL MSVCRT_strtod_l( const char *str, char **end, MSVCRT__locale_t loca int exp=0, sign=1; const char *p; 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;
@@ -378,10 +379,16 @@ double CDECL MSVCRT_strtod_l( const char *str, char **end, MSVCRT__locale_t loca _control87(MSVCRT__EM_DENORMAL|MSVCRT__EM_INVALID|MSVCRT__EM_ZERODIVIDE |MSVCRT__EM_OVERFLOW|MSVCRT__EM_UNDERFLOW|MSVCRT__EM_INEXACT, 0xffffffff);
- if(exp>0) - ret = (double)sign*d*pow(10, exp); - else - ret = (double)sign*d/pow(10, -exp); + negexp = (exp < 0); + if(negexp) + exp = -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);