Piotr Caban : msvcrt: Improved _atoflt_l precision.

Alexandre Julliard julliard at winehq.org
Tue Nov 6 14:27:29 CST 2012


Module: wine
Branch: master
Commit: a3035679d5a43898b3bcb52bcebb716156040b8c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a3035679d5a43898b3bcb52bcebb716156040b8c

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Nov  6 10:33:20 2012 +0100

msvcrt: Improved _atoflt_l precision.

---

 dlls/msvcrt/msvcrt.h |    1 +
 dlls/msvcrt/string.c |    6 +++---
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 77d30b2..da8e0a8 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -983,6 +983,7 @@ int pf_printf_w(puts_clbk_w, void*, const MSVCRT_wchar_t*, MSVCRT__locale_t,
         BOOL, BOOL, args_clbk, void*, __ms_va_list*) DECLSPEC_HIDDEN;
 printf_arg arg_clbk_valist(void*, int, int, __ms_va_list*) DECLSPEC_HIDDEN;
 
+#define MSVCRT_FLT_MIN 1.175494351e-38F
 #define MSVCRT__OVERFLOW  3
 #define MSVCRT__UNDERFLOW 4
 
diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c
index 55e652f..2a6a8ca 100644
--- a/dlls/msvcrt/string.c
+++ b/dlls/msvcrt/string.c
@@ -514,13 +514,13 @@ int CDECL MSVCRT__atoflt_l( MSVCRT__CRT_FLOAT *value, char *str, MSVCRT__locale_
             |MSVCRT__EM_OVERFLOW|MSVCRT__EM_UNDERFLOW|MSVCRT__EM_INEXACT, 0xffffffff);
 
     if(exp>0)
-        value->f = (float)sign*d*powf(10, exp);
+        value->f = (double)sign*d*pow(10, exp);
     else
-        value->f = (float)sign*d/powf(10, -exp);
+        value->f = (double)sign*d/pow(10, -exp);
 
     _control87(fpcontrol, 0xffffffff);
 
-    if((d && value->f==0.0) || isinf(value->f))
+    if((d && value->f>-MSVCRT_FLT_MIN && value->f<MSVCRT_FLT_MIN) || isinf(value->f))
         ret = exp > 0 ? MSVCRT__OVERFLOW : MSVCRT__UNDERFLOW;
 
     return ret;




More information about the wine-cvs mailing list