t-binary.cc revision 1.1.1.1
1/* Test mp*_class binary expressions. 2 3Copyright 2001, 2002, 2003, 2008 Free Software Foundation, Inc. 4 5This file is part of the GNU MP Library. 6 7The GNU MP Library is free software; you can redistribute it and/or modify 8it under the terms of the GNU Lesser General Public License as published by 9the Free Software Foundation; either version 3 of the License, or (at your 10option) any later version. 11 12The GNU MP Library is distributed in the hope that it will be useful, but 13WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 15License for more details. 16 17You should have received a copy of the GNU Lesser General Public License 18along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ 19 20#include "config.h" 21 22#include <iostream> 23 24#include "gmp.h" 25#include "gmpxx.h" 26#include "gmp-impl.h" 27#include "tests.h" 28 29using namespace std; 30 31 32void 33check_mpz (void) 34{ 35 // template <class T, class Op> 36 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, T>, Op> > 37 { 38 mpz_class a(1), b(2); 39 mpz_class c(a + b); ASSERT_ALWAYS(c == 3); 40 } 41 { 42 mpz_class a(3), b(4); 43 mpz_class c; 44 c = a * b; ASSERT_ALWAYS(c == 12); 45 } 46 { 47 mpz_class a(5), b(3); 48 mpz_class c; 49 c = a % b; ASSERT_ALWAYS(c == 2); 50 } 51 52 // template <class T, class U, class Op> 53 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, U, Op> > 54 { 55 mpz_class a(1); 56 signed int b = 3; 57 mpz_class c(a - b); ASSERT_ALWAYS(c == -2); 58 } 59 { 60 mpz_class a(-8); 61 unsigned int b = 2; 62 mpz_class c; 63 c = a / b; ASSERT_ALWAYS(c == -4); 64 } 65 { 66 mpz_class a(2); 67 double b = 3.0; 68 mpz_class c(a + b); ASSERT_ALWAYS(c == 5); 69 } 70 { 71 mpz_class a(4); 72 mpz_class b; 73 b = a + 0; ASSERT_ALWAYS(b == 4); 74 } 75 76 // template <class T, class U, class Op> 77 // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, T>, Op> > 78 { 79 mpz_class a(3); 80 signed int b = 9; 81 mpz_class c(b / a); ASSERT_ALWAYS(c == 3); 82 } 83 84 // template <class T, class U, class V, class W, class Op> 85 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, Op> > 86 // type of result can't be mpz 87 88 // template <class T, class U, class V, class W, class Op> 89 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, W>, Op> > 90 // type of result can't be mpz 91 92 // template <class T, class U, class Op> 93 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, U>, Op> > 94 { 95 mpz_class a(3), b(4); 96 mpz_class c(a * (-b)); ASSERT_ALWAYS(c == -12); 97 } 98 99 // template <class T, class U, class Op> 100 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, T>, Op> > 101 { 102 mpz_class a(3), b(2), c(1); 103 mpz_class d; 104 d = (a % b) + c; ASSERT_ALWAYS(d == 2); 105 } 106 107 // template <class T, class U, class V, class Op> 108 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, V, Op> > 109 { 110 mpz_class a(-5); 111 unsigned int b = 2; 112 mpz_class c((-a) << b); ASSERT_ALWAYS(c == 20); 113 } 114 { 115 mpz_class a(5), b(-4); 116 signed int c = 3; 117 mpz_class d; 118 d = (a * b) >> c; ASSERT_ALWAYS(d == -3); 119 } 120 121 // template <class T, class U, class V, class Op> 122 // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, V>, Op> > 123 { 124 mpz_class a(2), b(4); 125 double c = 6; 126 mpz_class d(c / (a - b)); ASSERT_ALWAYS(d == -3); 127 } 128 { 129 mpz_class a(3), b(2); 130 double c = 1; 131 mpz_class d; 132 d = c + (a + b); ASSERT_ALWAYS(d == 6); 133 } 134 135 // template <class T, class U, class V, class W, class Op> 136 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, Op> > 137 // type of result can't be mpz 138 139 // template <class T, class U, class V, class W, class Op> 140 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, W>, Op> > 141 // type of result can't be mpz 142 143 // template <class T, class U, class V, class Op> 144 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, V>, Op> > 145 { 146 mpz_class a(3), b(5), c(7); 147 mpz_class d; 148 d = (a - b) * (-c); ASSERT_ALWAYS(d == 14); 149 } 150 151 { 152 mpz_class a(0xcafe), b(0xbeef), c, want; 153 c = a & b; ASSERT_ALWAYS (c == 0x8aee); 154 c = a | b; ASSERT_ALWAYS (c == 0xfeff); 155 c = a ^ b; ASSERT_ALWAYS (c == 0x7411); 156 c = a & 0xbeef; ASSERT_ALWAYS (c == 0x8aee); 157 c = a | 0xbeef; ASSERT_ALWAYS (c == 0xfeff); 158 c = a ^ 0xbeef; ASSERT_ALWAYS (c == 0x7411); 159 c = a & -0xbeef; ASSERT_ALWAYS (c == 0x4010); 160 c = a | -0xbeef; ASSERT_ALWAYS (c == -0x3401); 161 c = a ^ -0xbeef; ASSERT_ALWAYS (c == -0x7411); 162 c = a & 48879.0; ASSERT_ALWAYS (c == 0x8aee); 163 c = a | 48879.0; ASSERT_ALWAYS (c == 0xfeff); 164 c = a ^ 48879.0; ASSERT_ALWAYS (c == 0x7411); 165 166 c = a | 1267650600228229401496703205376.0; // 2^100 167 want = "0x1000000000000000000000cafe"; 168 ASSERT_ALWAYS (c == want); 169 } 170 171} 172 173void 174check_mpq (void) 175{ 176 // template <class T, class Op> 177 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, T>, Op> > 178 { 179 mpq_class a(1, 2), b(3, 4); 180 mpq_class c(a + b); ASSERT_ALWAYS(c == 1.25); 181 } 182 183 // template <class T, class U, class Op> 184 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, U, Op> > 185 { 186 mpq_class a(1, 2); 187 signed int b = 3; 188 mpq_class c(a - b); ASSERT_ALWAYS(c == -2.5); 189 } 190 { 191 mpq_class a(1, 2); 192 mpq_class b; 193 b = a + 0; ASSERT_ALWAYS(b == 0.5); 194 } 195 196 // template <class T, class U, class Op> 197 // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, T>, Op> > 198 { 199 mpq_class a(2, 3); 200 signed int b = 4; 201 mpq_class c; 202 c = b / a; ASSERT_ALWAYS(c == 6); 203 } 204 205 // template <class T, class U, class V, class Op> 206 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<U, V>, Op> > 207 { 208 mpq_class a(1, 2); 209 mpz_class b(1); 210 mpq_class c(a + b); ASSERT_ALWAYS(c == 1.5); 211 } 212 { 213 mpq_class a(2, 3); 214 mpz_class b(1); 215 double c = 2.0; 216 mpq_class d; 217 d = a * (b + c); ASSERT_ALWAYS(d == 2); 218 } 219 220 // template <class T, class U, class V, class Op> 221 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, T>, Op> > 222 { 223 mpq_class a(2, 3); 224 mpz_class b(4); 225 mpq_class c(b / a); ASSERT_ALWAYS(c == 6); 226 } 227 { 228 mpq_class a(2, 3); 229 mpz_class b(1), c(4); 230 mpq_class d; 231 d = (b - c) * a; ASSERT_ALWAYS(d == -2); 232 } 233 234 // template <class T, class U, class Op> 235 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, U>, Op> > 236 { 237 mpq_class a(1, 3), b(3, 4); 238 mpq_class c; 239 c = a * (-b); ASSERT_ALWAYS(c == -0.25); 240 } 241 242 // template <class T, class U, class Op> 243 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, T>, Op> > 244 { 245 mpq_class a(1, 3), b(2, 3), c(1, 4); 246 mpq_class d((a / b) + c); ASSERT_ALWAYS(d == 0.75); 247 } 248 249 // template <class T, class U, class V, class Op> 250 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, V, Op> > 251 { 252 mpq_class a(3, 8); 253 unsigned int b = 4; 254 mpq_class c((-a) << b); ASSERT_ALWAYS(c == -6); 255 } 256 257 // template <class T, class U, class V, class Op> 258 // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, V>, Op> > 259 { 260 mpq_class a(1, 2), b(1, 4); 261 double c = 6.0; 262 mpq_class d; 263 d = c / (a + b); ASSERT_ALWAYS(d == 8); 264 } 265 266 // template <class T, class U, class V, class W, class Op> 267 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, Op> > 268 { 269 mpq_class a(1, 2), b(1, 4); 270 mpz_class c(1); 271 mpq_class d((a + b) - c); ASSERT_ALWAYS(d == -0.25); 272 } 273 { 274 mpq_class a(1, 3), b(3, 2); 275 mpz_class c(2), d(4); 276 mpq_class e; 277 e = (a * b) / (c - d); ASSERT_ALWAYS(e == -0.25); 278 } 279 280 // template <class T, class U, class V, class W, class Op> 281 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, W>, Op> > 282 { 283 mpq_class a(1, 3), b(3, 4); 284 mpz_class c(-3); 285 mpq_class d(c * (a * b)); ASSERT_ALWAYS(d == -0.75); 286 } 287 { 288 mpq_class a(1, 3), b(3, 5); 289 mpz_class c(6); 290 signed int d = 4; 291 mpq_class e; 292 e = (c % d) / (a * b); ASSERT_ALWAYS(e == 10); 293 } 294 295 // template <class T, class U, class V, class Op> 296 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, V>, Op> > 297 { 298 mpq_class a(1, 3), b(3, 4), c(2, 5); 299 mpq_class d; 300 d = (a * b) / (-c); ASSERT_ALWAYS(d == -0.625); 301 } 302} 303 304void 305check_mpf (void) 306{ 307 // template <class T, class Op> 308 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, T>, Op> > 309 { 310 mpf_class a(1), b(2); 311 mpf_class c(a + b); ASSERT_ALWAYS(c == 3); 312 } 313 { 314 mpf_class a(1.5), b(6); 315 mpf_class c; 316 c = a / b; ASSERT_ALWAYS(c == 0.25); 317 } 318 319 // template <class T, class U, class Op> 320 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, U, Op> > 321 { 322 mpf_class a(1); 323 signed int b = -2; 324 mpf_class c(a - b); ASSERT_ALWAYS(c == 3); 325 } 326 { 327 mpf_class a(2); 328 mpf_class b; 329 b = a + 0; ASSERT_ALWAYS(b == 2); 330 } 331 332 // template <class T, class U, class Op> 333 // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, T>, Op> > 334 { 335 mpf_class a(2); 336 unsigned int b = 3; 337 mpf_class c; 338 c = b / a; ASSERT_ALWAYS(c == 1.5); 339 } 340 341 // template <class T, class U, class V, class Op> 342 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<U, V>, Op> > 343 { 344 mpf_class a(2); 345 mpz_class b(3); 346 mpf_class c(a - b); ASSERT_ALWAYS(c == -1); 347 } 348 { 349 mpf_class a(3); 350 mpz_class b(2), c(1); 351 mpf_class d; 352 d = a * (b + c); ASSERT_ALWAYS(d == 9); 353 } 354 355 // template <class T, class U, class V, class Op> 356 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, T>, Op> > 357 { 358 mpf_class a(6); 359 mpq_class b(3, 4); 360 mpf_class c(a * b); ASSERT_ALWAYS(c == 4.5); 361 } 362 363 // template <class T, class U, class Op> 364 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, U>, Op> > 365 { 366 mpf_class a(2), b(-3); 367 mpf_class c; 368 c = a * (-b); ASSERT_ALWAYS(c == 6); 369 } 370 371 // template <class T, class U, class Op> 372 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, T>, Op> > 373 { 374 mpf_class a(3), b(4), c(5); 375 mpf_class d; 376 d = (a / b) - c; ASSERT_ALWAYS(d == -4.25); 377 } 378 379 // template <class T, class U, class V, class Op> 380 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, V, Op> > 381 { 382 mpf_class a(3); 383 unsigned int b = 2; 384 mpf_class c((-a) >> b); ASSERT_ALWAYS(c == -0.75); 385 } 386 387 // template <class T, class U, class V, class Op> 388 // __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, V>, Op> > 389 { 390 mpf_class a(2), b(3); 391 double c = 5.0; 392 mpf_class d; 393 d = c / (a + b); ASSERT_ALWAYS(d == 1); 394 } 395 396 // template <class T, class U, class V, class W, class Op> 397 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, Op> > 398 { 399 mpf_class a(2), b(3); 400 mpz_class c(4); 401 mpf_class d; 402 d = (a + b) * c; ASSERT_ALWAYS(d == 20); 403 } 404 { 405 mpf_class a(2), b(3); 406 mpq_class c(1, 2), d(1, 4); 407 mpf_class e; 408 e = (a * b) / (c + d); ASSERT_ALWAYS(e == 8); 409 } 410 411 // template <class T, class U, class V, class W, class Op> 412 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, W>, Op> > 413 { 414 mpf_class a(1), b(2); 415 mpq_class c(3); 416 mpf_class d(c / (a + b)); ASSERT_ALWAYS(d == 1); 417 } 418 { 419 mpf_class a(1); 420 mpz_class b(2); 421 mpq_class c(3, 4); 422 mpf_class d; 423 d = (-c) + (a + b); ASSERT_ALWAYS(d == 2.25); 424 } 425 426 // template <class T, class U, class V, class Op> 427 // __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, V>, Op> > 428 { 429 mpf_class a(1), b(2), c(3); 430 mpf_class d; 431 d = (a + b) * (-c); ASSERT_ALWAYS(d == -9); 432 } 433} 434 435 436int 437main (void) 438{ 439 tests_start(); 440 441 check_mpz(); 442 check_mpq(); 443 check_mpf(); 444 445 tests_end(); 446 return 0; 447} 448