Numworks Epsilon  1.4.1
Graphing Calculator Operating System
integer.cpp
Go to the documentation of this file.
1 #include <quiz.h>
2 #include <poincare.h>
3 #include <assert.h>
4 
5 using namespace Poincare;
6 
7 QUIZ_CASE(poincare_integer) {
8  assert(Integer(123).isEqualTo(Integer(123)));
9  assert(Integer("123").isEqualTo(Integer(123)));
10  assert(!Integer("-123").isEqualTo(Integer(123)));
11  assert(Integer("-123").isEqualTo(Integer(-123)));
12  assert(Integer((int64_t)1234567891011121314).isEqualTo(Integer((int64_t)1234567891011121314)));
13  //FIXME: assert(Integer("0x2BABE") == Integer(178878));
14  //FIXME: assert(Integer("0b1011") == Integer(11));
15 }
16 
17 QUIZ_CASE(poincare_integer_compare) {
18  assert(Integer(123).isLowerThan(Integer(456)));
19  assert(!Integer(123).isLowerThan(Integer(123)));
20  assert(!Integer(-123).isLowerThan(Integer(-123)));
21  assert(Integer(-100).isLowerThan(Integer(2)));
22  assert(Integer(-200).isLowerThan(Integer(-100)));
23  assert(Integer(123).isLowerThan(Integer("123456789123456789")));
24  assert(Integer(-123).isLowerThan(Integer("123456789123456789")));
25  assert(Integer("123456789123456788").isLowerThan(Integer("123456789123456789")));
26  assert(Integer("-1234567891234567892109209109").isLowerThan(Integer("123456789123456789")));
27  assert(!Integer("123456789123456789").isLowerThan(Integer("123456789123456788")));
28 }
29 
30 QUIZ_CASE(poincare_integer_addition) {
31  assert(Integer::Addition(Integer("0"), Integer("0")).isEqualTo(Integer(0)));
32  assert(Integer::Addition(Integer(123), Integer(456)).isEqualTo(Integer(579)));
33  assert(Integer::Addition(Integer("123456789123456789"), Integer(1)).isEqualTo(Integer("123456789123456790")));
34  assert(Integer::Addition(Integer("-123456789123456789"), Integer("123456789123456789")).isEqualTo(Integer("0")));
35  assert(Integer::Addition(Integer("234"), Integer(-234)).isEqualTo(Integer(0)));
36  assert(Integer::Addition(Integer("18446744073709551616"), Integer("18446744073709551368")).isEqualTo(Integer("36893488147419102984")));
37  //2^64+2^64
38  assert(Integer::Addition(Integer("18446744073709551616"), Integer("18446744073709551616")).isEqualTo(Integer("36893488147419103232")));
39  //2^64+2^32
40  assert(Integer::Addition(Integer("18446744073709551616"), Integer("4294967296")).isEqualTo(Integer("18446744078004518912")));
41  //2^64+1
42  assert(Integer::Addition(Integer("18446744073709551616"), Integer("1")).isEqualTo(Integer("18446744073709551617")));
43  //2^32+2^32
44  assert(Integer::Addition(Integer("4294967296"), Integer("4294967296")).isEqualTo(Integer("8589934592")));
45  //2^32+1
46  assert(Integer::Addition(Integer("4294967296"), Integer("1")).isEqualTo(Integer("4294967297")));
47  //2^16+1
48  assert(Integer::Addition(Integer("65537"), Integer("1")).isEqualTo(Integer("65538")));
49  //2^16+2^16
50  assert(Integer::Addition(Integer("65537"), Integer("65537")).isEqualTo(Integer("131074")));
51 }
52 
53 QUIZ_CASE(poincare_integer_subtraction) {
54  assert(Integer::Subtraction(Integer(123), Integer(23)).isEqualTo(Integer(100)));
55  assert(Integer::Subtraction(Integer("123456789123456789"), Integer("9999999999")).isEqualTo(Integer("123456779123456790")));
56  assert(Integer::Subtraction(Integer(23), Integer(100)).isEqualTo(Integer(-77)));
57  assert(Integer::Subtraction(Integer(23), Integer(23)).isEqualTo(Integer(0)));
58  assert(Integer::Subtraction(Integer(-23), Integer(-23)).isEqualTo(Integer(0)));
59  assert(Integer::Subtraction(Integer("-123456789123456789"), Integer("-123456789123456789")).isEqualTo(Integer(0)));
60  assert(Integer::Subtraction(Integer("123456789123456789"), Integer("123456789123456789")).isEqualTo(Integer(0)));
61  assert(Integer::Subtraction(Integer("18446744073709551616"), Integer("18446744073709551368")).isEqualTo(Integer(248)));
62 
63  //2^64-2^64
64  assert(Integer::Subtraction(Integer("18446744073709551616"), Integer("18446744073709551616")).isEqualTo(Integer("0")));
65  //2^64-2^32
66  assert(Integer::Subtraction(Integer("18446744073709551616"), Integer("4294967296")).isEqualTo(Integer("18446744069414584320")));
67  //2^32-2^64
68  assert(Integer::Subtraction(Integer("4294967296"), Integer("18446744073709551616")).isEqualTo(Integer("-18446744069414584320")));
69  //2^64-1
70  assert(Integer::Subtraction(Integer("18446744073709551616"), Integer("1")).isEqualTo(Integer("18446744073709551615")));
71  //1-2^64
72  assert(Integer::Subtraction(Integer("1"), Integer("18446744073709551616")).isEqualTo(Integer("-18446744073709551615")));
73  //2^32-2^32
74  assert(Integer::Subtraction(Integer("4294967296"), Integer("4294967296")).isEqualTo(Integer("0")));
75  //2^32-1
76  assert(Integer::Subtraction(Integer("4294967296"), Integer("1")).isEqualTo(Integer("4294967295")));
77  //2^16-1
78  assert(Integer::Subtraction(Integer("65537"), Integer("1")).isEqualTo(Integer("65536")));
79  //2^16-2^16
80  assert(Integer::Subtraction(Integer("65537"), Integer("65537")).isEqualTo(Integer("0")));
81 }
82 
83 QUIZ_CASE(poincare_integer_multiplication) {
84  assert(Integer::Multiplication(Integer(12), Integer(34)).isEqualTo(Integer(408)));
85  assert(Integer::Multiplication(Integer(56), Integer(0)).isEqualTo(Integer(0)));
86  assert(Integer::Multiplication(Integer(-12), Integer(34)).isEqualTo(Integer(-408)));
87  assert(Integer::Multiplication(Integer(-12), Integer(-34)).isEqualTo(Integer(408)));
88  assert(Integer::Multiplication(Integer(123456), Integer(654321)).isEqualTo(Integer("80779853376")));
89  assert(Integer::Multiplication(Integer("9999999999"), Integer("9999999999")).isEqualTo(Integer("99999999980000000001")));
90  assert(Integer::Multiplication(Integer("-23"), Integer("0")).isEqualTo(Integer("0")));
91  assert(Integer::Multiplication(Integer("-23456787654567765456"), Integer("0")).isEqualTo(Integer("0")));
92 }
93 
94 QUIZ_CASE(poincare_integer_divide) {
96  assert(Integer::Division(Integer("3293920983030066"), Integer(38928)).quotient.isEqualTo(Integer("84615726033")) && Integer::Division(Integer("3293920983030066"), Integer(38928)).remainder.isEqualTo(Integer(17442)));
97  assert(Integer::Division(Integer("3293920983030066"), Integer("389282362616")).quotient.isEqualTo(Integer(8461)) && Integer::Division(Integer("3293920983030066"), Integer("389282362616")).remainder.isEqualTo(Integer("202912936090")));
98  assert(Integer::Division(Integer("-18940566"), Integer("499030")).quotient.isEqualTo(Integer(-38)) && Integer::Division(Integer("-18940566"), Integer("499030")).remainder.isEqualTo(Integer("22574")));
99  assert(Integer::Division(Integer("234567909876"), Integer("-234567898")).quotient.isEqualTo(Integer(-1000)) && Integer::Division(Integer("234567909876"), Integer("-234567898")).remainder.isEqualTo(Integer("11876")));
100  assert(Integer::Division(Integer("-567"), Integer("-12")).quotient.isEqualTo(Integer(48)) && Integer::Division(Integer("-567"), Integer("-12")).remainder.isEqualTo(Integer("9")));
101  assert(Integer::Division(Integer("-576"), Integer("-12")).quotient.isEqualTo(Integer(48)) && Integer::Division(Integer("-576"), Integer("-12")).remainder.isEqualTo(Integer("0")));
102  assert(Integer::Division(Integer("576"), Integer("-12")).quotient.isEqualTo(Integer(-48)) && Integer::Division(Integer("576"), Integer("-12")).remainder.isEqualTo(Integer("0")));
103  assert(Integer::Division(Integer("-576"), Integer("12")).quotient.isEqualTo(Integer(-48)) && Integer::Division(Integer("-576"), Integer("12")).remainder.isEqualTo(Integer("0")));
104  assert(Integer::Division(Integer("12345678910111213141516171819202122232425"), Integer("10")).remainder.isEqualTo(Integer("5")));
105  assert(Integer::Division(Integer("12345678910111213141516171819202122232425"), Integer("10")).quotient.isEqualTo(Integer("1234567891011121314151617181920212223242")));
106  assert(Integer::Division(Integer("1234567891011121314151617181920212223242"), Integer("10")).quotient.isEqualTo(Integer("123456789101112131415161718192021222324")) && Integer::Division(Integer("1234567891011121314151617181920212223242"), Integer("10")).remainder.isEqualTo(Integer("2")));
107  assert(Integer::Division(Integer("123456789101112131415161718192021222324"), Integer("10")).quotient.isEqualTo(Integer("12345678910111213141516171819202122232")) && Integer::Division(Integer("123456789101112131415161718192021222324"), Integer("10")).remainder.isEqualTo(Integer("4")));
108  assert(Integer::Division(Integer("12345678910111213141516171819202122232"), Integer("10")).quotient.isEqualTo(Integer("1234567891011121314151617181920212223")) && Integer::Division(Integer("12345678910111213141516171819202122232"), Integer("10")).remainder.isEqualTo(Integer("2")));
109  assert(Integer::Division(Integer("1234567891011121314151617181920212223"), Integer("10")).quotient.isEqualTo(Integer("123456789101112131415161718192021222")) && Integer::Division(Integer("1234567891011121314151617181920212223"), Integer("10")).remainder.isEqualTo(Integer("3")));
110  assert(Integer::Division(Integer("123456789101112131415161718192021222"), Integer("10")).quotient.isEqualTo(Integer("12345678910111213141516171819202122")) && Integer::Division(Integer("123456789101112131415161718192021222"), Integer("10")).remainder.isEqualTo(Integer("2")));
111  assert(Integer::Division(Integer("12345678910111213141516171819202122"), Integer("10")).quotient.isEqualTo(Integer("1234567891011121314151617181920212")) && Integer::Division(Integer("12345678910111213141516171819202122"), Integer("10")).remainder.isEqualTo(Integer("2")));
112  assert(Integer::Division(Integer("0"), Integer("-10")).quotient.isEqualTo(Integer("0")) && Integer::Division(Integer("0"), Integer("-10")).remainder.isEqualTo(Integer("0")));
113  assert(Integer::Division(Integer("0"), Integer("-123456789098760")).quotient.isEqualTo(Integer("0")) && Integer::Division(Integer("0"), Integer("-123456789098760")).remainder.isEqualTo(Integer("0")));
114  assert(Integer::Division(Integer("2305843009213693952"), Integer("2305843009213693921")).quotient.isEqualTo(Integer("1")) && Integer::Division(Integer("2305843009213693952"), Integer("2305843009213693921")).remainder.isEqualTo(Integer("31")));
115 }
116 
117 template<typename T>
118 void assert_integer_evals_to(const char * i, bool negative, T result) {
119  assert(Integer(i, negative).approximate<T>() == result);
120 }
121 
122 QUIZ_CASE(poincare_integer_evaluate) {
123  assert_integer_evals_to("1", false, 1.0f);
124  assert_integer_evals_to("1", false, 1.0);
125  assert_integer_evals_to("12345678", false, 12345678.0f);
126  assert_integer_evals_to("12345678", false, 12345678.0);
127  assert_integer_evals_to("0", false, 0.0f);
128  assert_integer_evals_to("0", false, 0.0);
129  assert_integer_evals_to("0", true, 0.0f);
130  assert_integer_evals_to("0", true, 0.0);
131  assert_integer_evals_to("1", true, -1.0f);
132  assert_integer_evals_to("1", true, -1.0);
133  assert_integer_evals_to("12345678", false, 12345678.0f);
134  assert_integer_evals_to("12345678", false, 12345678.0);
135  assert_integer_evals_to("4294967295", false, 4294967295.0f);
136  assert_integer_evals_to("4294967295", false, 4294967295.0);
137  assert_integer_evals_to("4294967296", true, -4294967296.0f);
138  assert_integer_evals_to("4294967296", true, -4294967296.0);
139  assert_integer_evals_to("2147483648", false, 2147483648.0f);
140  assert_integer_evals_to("2147483648", false, 2147483648.0);
141  assert_integer_evals_to("18446744073709551615", true, -18446744073709551615.0f);
142  assert_integer_evals_to("18446744073709551615", true, -18446744073709551615.0);
143  assert_integer_evals_to("18446744073709551616", true, -18446744073709551616.0f);
144  assert_integer_evals_to("18446744073709551616", true, -18446744073709551616.0);
145  assert_integer_evals_to("92233720372036854775808", false, 92233720372036854775808.0f);
146  assert_integer_evals_to("92233720372036854775808", false, 92233720372036854775808.0);
147  assert_integer_evals_to("134217720", false, 134217720.0f);
148  assert_integer_evals_to("134217720", false, 134217720.0);
149  assert_integer_evals_to("67108864", false, 67108864.0f);
150  assert_integer_evals_to("67108864", false, 67108864.0);
151  assert_integer_evals_to("33554432", false, 33554432.0f);
152  assert_integer_evals_to("33554432", false, 33554432.0);
153  assert_integer_evals_to("2", false, 2.0f);
154  assert_integer_evals_to("2", false, 2.0);
155  assert_integer_evals_to("4", false, 4.0f);
156  assert_integer_evals_to("4", false, 4.0);
157 }
#define assert(e)
Definition: assert.h:9
#define T(x)
Definition: events.cpp:26
bool isEqualTo(const Integer &other) const
Definition: integer.cpp:222
static Integer Addition(const Integer &i, const Integer &j)
Definition: integer.cpp:232
static Integer Subtraction(const Integer &i, const Integer &j)
Definition: integer.cpp:236
void assert_integer_evals_to(const char *i, bool negative, T result)
Definition: integer.cpp:118
signed long long int64_t
Definition: stdint.h:12
static Integer Multiplication(const Integer &i, const Integer &j)
Definition: integer.cpp:240
static IntegerDivision Division(const Integer &numerator, const Integer &denominator)
Definition: integer.cpp:281
QUIZ_CASE(poincare_integer)
Definition: integer.cpp:7