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