Paranoia is setting in
[ipdf/code.git] / src / tests / paranoidcalculator.cpp
1 #include "main.h"
2 #include "real.h"
3 #include <cmath>
4 #include <cassert>
5 #include <list>
6 #include <bitset>
7 #include <iostream>
8 #include <cfloat>
9 #include <fenv.h>
10 #include "paranoidnumber.h"
11
12 using namespace std;
13 using namespace IPDF;
14
15 int main(int argc, char ** argv)
16 {
17         Debug("FLT_MAX = %.40f", FLT_MAX);
18         Debug("FLT_MIN = %.40f", FLT_MIN);
19         Debug("FLT_EPSILON = %.40f", FLT_EPSILON);
20         Debug("Sizeof ParanoidNumber::digit_t is %u", sizeof(ParanoidNumber::digit_t));
21         Debug("Sizeof ParanoidNumber is %u", sizeof(ParanoidNumber));
22
23         string token("");
24         cin >> token;   
25         ParanoidNumber a(token.c_str());
26         double da = a.ToDouble();
27         float fa = da;
28         while (cin.good())
29         {
30                 char op;
31                 cin >> op;
32                 token = "";
33                 for (char c = cin.peek(); cin.good() && !iswspace(c); c = cin.peek())
34                 {
35                         if (c == '+' || c == '-' || c == '*' || c == '/')
36                         {
37                                 break;
38                         }
39                         token += c;
40                         c = cin.get();
41                 }
42                 Debug("String is %s", token.c_str());
43                 float fb = strtof(token.c_str(), NULL);
44                 double db = strtod(token.c_str(), NULL);
45                 ParanoidNumber b(token.c_str());
46                 Debug("b is {%s} %lf", b.Str().c_str(), b.ToDouble());
47                 switch (op)
48                 {
49                         case '+':
50                                 a += b;
51                                 fa += fb;
52                                 da += db;
53                                 break;
54                         case '-':
55                                 a -= b;
56                                 fa -= fb;
57                                 da -= db;
58                                 break;
59                         case '*':
60                                 a *= b;
61                                 fa *= fb;
62                                 da *= db;
63                                 break;
64                         case '/':
65                                 a /= b;
66                                 fa /= fb;
67                                 da /= db;
68                                 break;
69                 }
70                         
71                 Debug("a is: %s", a.Str().c_str());
72                 Debug("a as double: %.40f\n", a.ToDouble());
73                 Debug("floats give: %.40f\n", fa);
74                 Debug("double gives: %.40f\n", da);
75                 
76                 
77         }
78 }

UCC git Repository :: git.ucc.asn.au