[PATCH] msvcrt/tests: Add more scanf floating-point tests.
=?utf-8?q?J=C4=81nis=20R=C5=ABcis?=
parasti at gmail.com
Fri Feb 15 15:07:11 CST 2008
The included patch adds a couple of scanf floating-point tests to expose
a problem with the algorithm. It seems that it doesn't handle negative
exponents very well, resulting in single-precision values being
off-by-one in the last bit of significant compared to those obtained
with the GNU C library or natively on Windows XP.
All five tests pass on my Windows XP SP2 system (using a self-compiled
msvcrt_crosstest.exe tool). Test 3 and 4 fail with the current source
in Git. I will send another patch to this list with a potential fix.
(I am not sending these to wine-patches because I'm not sure I should.
"wine-devel" sounds about right.)
---
dlls/msvcrt/tests/scanf.c | 40 ++++++++++++++++++++++++++++++++++++----
1 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcrt/tests/scanf.c b/dlls/msvcrt/tests/scanf.c
index 65bea46..d5da3f6 100644
--- a/dlls/msvcrt/tests/scanf.c
+++ b/dlls/msvcrt/tests/scanf.c
@@ -28,7 +28,7 @@ static void test_sscanf( void )
char format[20];
int result, ret;
char c;
- float res1= -82.6267f, res2= 27.76f, res11, res12;
+ float orig, res;
static const char pname[]=" St. Petersburg, Florida\n";
int hour=21,min=59,sec=20;
int number,number_so_far;
@@ -64,9 +64,41 @@ static void test_sscanf( void )
ok( result == 12, "sscanf reads %x instead of %x\n", result, 12 );
/* Check float */
- ret = sprintf(buffer,"%f %f",res1, res2);
- ret = sscanf(buffer,"%f%f",&res11, &res12);
- ok( (res11 == res1) && (res12 == res2), "Error reading floats\n");
+
+ orig = -82.6267f;
+ ret = sprintf(buffer, "%f", orig);
+ ret = sscanf(buffer, "%f", &res);
+ ok(ret == 1, "Expected 1 float, got %d\n", ret);
+ ok(res == orig, "Wrote %e (0x%x), but read %e (0x%x)\n",
+ orig, *(unsigned int *) &orig, res, *(unsigned int *) &res);
+
+ orig = 27.76f;
+ ret = sprintf(buffer, "%f", orig);
+ ret = sscanf(buffer, "%f", &res);
+ ok(ret == 1, "Expected 1 float, got %d\n", ret);
+ ok(res == orig, "Wrote %e (0x%x), but read %e (0x%x)\n",
+ orig, *(unsigned int *) &orig, res, *(unsigned int *) &res);
+
+ orig = -6.61589e-2f;
+ ret = sprintf(buffer, "%e", orig);
+ ret = sscanf(buffer, "%e", &res);
+ ok(ret == 1, "Expected 1 float, got %d\n", ret);
+ ok(res == orig, "Wrote %e (0x%x), but read %e (0x%x)\n",
+ orig, *(unsigned int *) &orig, res, *(unsigned int *) &res);
+
+ orig = 1.72567e-7f;
+ ret = sprintf(buffer, "%e", orig);
+ ret = sscanf(buffer, "%e", &res);
+ ok(ret == 1, "Expected 1 float, got %d\n", ret);
+ ok(res == orig, "Wrote %e (0x%x), but read %e (0x%x)\n",
+ orig, *(unsigned int *) &orig, res, *(unsigned int *) &res);
+
+ orig = 15.483e+3f;
+ ret = sprintf(buffer, "%e", orig);
+ ret = sscanf(buffer, "%e", &res);
+ ok(ret == 1, "Expected 1 float, got %d\n", ret);
+ ok(res == orig, "Wrote %e (0x%x), but read %e (0x%x)\n",
+ orig, *(unsigned int *) &orig, res, *(unsigned int *) &res);
/* check strings */
ret = sprintf(buffer," %s", pname);
--
1.5.3.8
More information about the wine-devel
mailing list