1 /*++
2 Copyright (c) 2012 Microsoft Corporation
3 
4 Module Name:
5 
6     mpf.cpp
7 
8 Abstract:
9 
10     mpf repros...
11 
12 Author:
13 
14     Leonardo de Moura (leonardo) 2012-08-21.
15 
16 Revision History:
17 
18 --*/
19 #include "util/mpf.h"
20 #include "util/f2n.h"
21 
bug_set_int()22 static void bug_set_int() {
23     mpf_manager fm;
24     scoped_mpf  a(fm);
25 
26     fm.set(a, 11, 53, 3);
27     ENSURE(fm.to_double(a) == 3.0);
28 
29     fm.set(a, 11, 53, 0);
30     ENSURE(fm.to_double(a) == 0.0);
31 
32     fm.set(a, 11, 53, -1);
33     ENSURE(fm.to_double(a) == -1.0);
34 
35     fm.set(a, 11, 53, INT_MAX);
36     ENSURE(fm.to_double(a) == (double)INT_MAX);
37 
38     fm.set(a, 11, 53, INT_MIN);
39     ENSURE(fm.to_double(a) == (double)INT_MIN);
40 
41     fm.set(a, 8, 24, 3);
42     ENSURE(fm.to_float(a) == 3.0);
43     ENSURE(fm.to_double(a) == 3.0);
44 
45     fm.set(a, 8, 24, 0);
46     ENSURE(fm.to_float(a) == 0.0);
47     ENSURE(fm.to_double(a) == 0.0);
48 
49     fm.set(a, 8, 24, -1);
50     ENSURE(fm.to_float(a) == -1.0);
51     ENSURE(fm.to_double(a) == -1.0);
52 
53     fm.set(a, 8, 24, INT_MIN);
54     ENSURE(fm.to_float(a) == (float)INT_MIN);
55 
56     // CMW: This one depends on the rounding mode, but fm.set(..., int) doesn't have one.
57     // fm.set(a, 8, 24, INT_MAX);
58     // ENSURE(fm.to_float(a) == (float)INT_MAX);
59 }
60 
bug_set_double()61 static void bug_set_double() {
62     mpf_manager fm;
63     scoped_mpf  a(fm);
64 
65     fm.set(a, 11, 53, 2.5);
66     ENSURE(fm.to_double(a) == 2.5);
67 
68     fm.set(a, 11, 53, -42.25);
69     ENSURE(fm.to_double(a) == -42.25);
70 
71     fm.set(a, 8, 24, (double)2.5);
72     ENSURE(fm.to_double(a) == 2.5);
73 
74     fm.set(a, 8, 24, (double)-42.25);
75     ENSURE(fm.to_double(a) == -42.25);
76 
77     fm.set(a, 8, 24, (float)2.5);
78     ENSURE(fm.to_float(a) == 2.5);
79 
80     fm.set(a, 8, 24, (float)-42.25);
81     ENSURE(fm.to_float(a) == -42.25);
82 }
83 
tst_mpf()84 void tst_mpf() {
85     enable_trace("mpf_mul_bug");
86     bug_set_int();
87     bug_set_double();
88 }
89