Skip to content

Commit 3fd8788

Browse files
try to relax the test
1 parent 106fb4c commit 3fd8788

File tree

1 file changed

+20
-22
lines changed

1 file changed

+20
-22
lines changed

src/double_extras/test/t-mul_2exp.c

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,25 @@
1515
#include "double_extras.h"
1616
#include "d_vec.h"
1717

18+
static int
19+
_check_results(double res1, double res2)
20+
{
21+
if (d_is_nan(res2))
22+
return d_is_nan(res1);
23+
else
24+
#if !defined(_MSC_VER)
25+
return res1 == res2;
26+
#else
27+
/* MSVC's ldexp doesn't give the same result as multiplying by 2^e
28+
for subnormals, so relax the test */
29+
return (res1 == res2) || fabs(res1 - res2) < 1e-300;
30+
#endif
31+
}
32+
1833
TEST_FUNCTION_START(d_mul_2exp, state)
1934
{
2035
double x, res1, res2;
21-
int e, ok;
36+
int e;
2237
slong iter;
2338

2439
for (iter = 0; iter < 10000 * flint_test_multiplier(); iter++)
@@ -29,12 +44,7 @@ TEST_FUNCTION_START(d_mul_2exp, state)
2944
res1 = d_mul_2exp(x, e);
3045
res2 = ldexp(x, e);
3146

32-
if (d_is_nan(res2))
33-
ok = d_is_nan(res1);
34-
else
35-
ok = res1 == res2;
36-
37-
if (!ok)
47+
if (!_check_results(res1, res2))
3848
TEST_FUNCTION_FAIL("x = %.20g\n res1 = %.20g\n res2 = %.20g\n", x, res1, res2);
3949
}
4050

@@ -48,9 +58,7 @@ TEST_FUNCTION_START(d_mul_2exp, state)
4858
res1 = d_mul_2exp_inrange2(x, e);
4959
res2 = ldexp(x, e);
5060

51-
ok = res1 == res2;
52-
53-
if (!ok)
61+
if (!(res1 == res2))
5462
TEST_FUNCTION_FAIL("x = %.20g\n res1 = %.20g\n res2 = %.20g\n", x, res1, res2);
5563
}
5664

@@ -62,12 +70,7 @@ TEST_FUNCTION_START(d_mul_2exp, state)
6270
res1 = d_mul_2exp_inrange(x, e);
6371
res2 = ldexp(x, e);
6472

65-
if (d_is_nan(res2))
66-
ok = d_is_nan(res1);
67-
else
68-
ok = res1 == res2;
69-
70-
if (!ok)
73+
if (!_check_results(res1, res2))
7174
TEST_FUNCTION_FAIL("x = %.20g\n res1 = %.20g\n res2 = %.20g\n", x, res1, res2);
7275
}
7376

@@ -89,12 +92,7 @@ TEST_FUNCTION_START(d_mul_2exp, state)
8992
res1 = r[i];
9093
res2 = ldexp(v[i], e);
9194

92-
if (d_is_nan(res2))
93-
ok = d_is_nan(res1);
94-
else
95-
ok = res1 == res2;
96-
97-
if (!ok)
95+
if (!_check_results(res1, res2))
9896
TEST_FUNCTION_FAIL("x = %.20g\n res1 = %.20g\n res2 = %.20g\n", x, res1, res2);
9997
}
10098
}

0 commit comments

Comments
 (0)