1 1.1 mrg /* Test mpq_add and mpq_sub. 2 1.1 mrg 3 1.1 mrg Copyright 2001 Free Software Foundation, Inc. 4 1.1 mrg 5 1.1.1.2 mrg This file is part of the GNU MP Library test suite. 6 1.1 mrg 7 1.1.1.2 mrg The GNU MP Library test suite is free software; you can redistribute it 8 1.1.1.2 mrg and/or modify it under the terms of the GNU General Public License as 9 1.1.1.2 mrg published by the Free Software Foundation; either version 3 of the License, 10 1.1.1.2 mrg or (at your option) any later version. 11 1.1.1.2 mrg 12 1.1.1.2 mrg The GNU MP Library test suite is distributed in the hope that it will be 13 1.1.1.2 mrg useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1.1.2 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 15 1.1.1.2 mrg Public License for more details. 16 1.1 mrg 17 1.1.1.2 mrg You should have received a copy of the GNU General Public License along with 18 1.1.1.3 mrg the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ 19 1.1 mrg 20 1.1 mrg #include "config.h" 21 1.1 mrg 22 1.1 mrg #include <stdio.h> 23 1.1 mrg #include <stdlib.h> 24 1.1 mrg #include <string.h> 25 1.1 mrg 26 1.1 mrg #include "gmp-impl.h" 27 1.1 mrg #include "tests.h" 28 1.1 mrg 29 1.1 mrg 30 1.1 mrg void 31 1.1 mrg check_all (mpq_ptr x, mpq_ptr y, mpq_ptr want_add, mpq_ptr want_sub) 32 1.1 mrg { 33 1.1 mrg mpq_t got; 34 1.1 mrg int neg_x, neg_y, swap; 35 1.1 mrg 36 1.1 mrg mpq_init (got); 37 1.1 mrg 38 1.1 mrg MPQ_CHECK_FORMAT (want_add); 39 1.1 mrg MPQ_CHECK_FORMAT (want_sub); 40 1.1 mrg MPQ_CHECK_FORMAT (x); 41 1.1 mrg MPQ_CHECK_FORMAT (y); 42 1.1 mrg 43 1.1 mrg for (swap = 0; swap <= 1; swap++) 44 1.1 mrg { 45 1.1 mrg for (neg_x = 0; neg_x <= 1; neg_x++) 46 1.1 mrg { 47 1.1 mrg for (neg_y = 0; neg_y <= 1; neg_y++) 48 1.1 mrg { 49 1.1 mrg mpq_add (got, x, y); 50 1.1 mrg MPQ_CHECK_FORMAT (got); 51 1.1 mrg if (! mpq_equal (got, want_add)) 52 1.1 mrg { 53 1.1 mrg printf ("mpq_add wrong\n"); 54 1.1 mrg mpq_trace (" x ", x); 55 1.1 mrg mpq_trace (" y ", y); 56 1.1 mrg mpq_trace (" got ", got); 57 1.1 mrg mpq_trace (" want", want_add); 58 1.1 mrg abort (); 59 1.1 mrg } 60 1.1 mrg 61 1.1 mrg mpq_sub (got, x, y); 62 1.1 mrg MPQ_CHECK_FORMAT (got); 63 1.1 mrg if (! mpq_equal (got, want_sub)) 64 1.1 mrg { 65 1.1 mrg printf ("mpq_sub wrong\n"); 66 1.1 mrg mpq_trace (" x ", x); 67 1.1 mrg mpq_trace (" y ", y); 68 1.1 mrg mpq_trace (" got ", got); 69 1.1 mrg mpq_trace (" want", want_sub); 70 1.1 mrg abort (); 71 1.1 mrg } 72 1.1 mrg 73 1.1 mrg 74 1.1 mrg mpq_neg (y, y); 75 1.1 mrg mpq_swap (want_add, want_sub); 76 1.1 mrg } 77 1.1 mrg 78 1.1 mrg mpq_neg (x, x); 79 1.1 mrg mpq_swap (want_add, want_sub); 80 1.1 mrg mpq_neg (want_add, want_add); 81 1.1 mrg mpq_neg (want_sub, want_sub); 82 1.1 mrg } 83 1.1 mrg 84 1.1 mrg mpq_swap (x, y); 85 1.1 mrg mpq_neg (want_sub, want_sub); 86 1.1 mrg } 87 1.1 mrg 88 1.1 mrg mpq_clear (got); 89 1.1 mrg } 90 1.1 mrg 91 1.1 mrg 92 1.1 mrg void 93 1.1 mrg check_data (void) 94 1.1 mrg { 95 1.1 mrg static const struct { 96 1.1 mrg const char *x; 97 1.1 mrg const char *y; 98 1.1 mrg const char *want_add; 99 1.1 mrg const char *want_sub; 100 1.1 mrg 101 1.1 mrg } data[] = { 102 1.1 mrg 103 1.1 mrg { "0", "0", "0", "0" }, 104 1.1 mrg { "1", "0", "1", "1" }, 105 1.1 mrg { "1", "1", "2", "0" }, 106 1.1 mrg 107 1.1 mrg { "1/2", "1/2", "1", "0" }, 108 1.1 mrg { "5/6", "14/15", "53/30", "-1/10" }, 109 1.1 mrg }; 110 1.1 mrg 111 1.1 mrg mpq_t x, y, want_add, want_sub; 112 1.1 mrg int i; 113 1.1 mrg 114 1.1 mrg mpq_init (x); 115 1.1 mrg mpq_init (y); 116 1.1 mrg mpq_init (want_add); 117 1.1 mrg mpq_init (want_sub); 118 1.1 mrg 119 1.1 mrg for (i = 0; i < numberof (data); i++) 120 1.1 mrg { 121 1.1 mrg mpq_set_str_or_abort (x, data[i].x, 0); 122 1.1 mrg mpq_set_str_or_abort (y, data[i].y, 0); 123 1.1 mrg mpq_set_str_or_abort (want_add, data[i].want_add, 0); 124 1.1 mrg mpq_set_str_or_abort (want_sub, data[i].want_sub, 0); 125 1.1 mrg 126 1.1 mrg check_all (x, y, want_add, want_sub); 127 1.1 mrg } 128 1.1 mrg 129 1.1 mrg mpq_clear (x); 130 1.1 mrg mpq_clear (y); 131 1.1 mrg mpq_clear (want_add); 132 1.1 mrg mpq_clear (want_sub); 133 1.1 mrg } 134 1.1 mrg 135 1.1 mrg 136 1.1 mrg void 137 1.1 mrg check_rand (void) 138 1.1 mrg { 139 1.1 mrg mpq_t x, y, want_add, want_sub; 140 1.1 mrg int i; 141 1.1 mrg gmp_randstate_ptr rands = RANDS; 142 1.1 mrg 143 1.1 mrg mpq_init (x); 144 1.1 mrg mpq_init (y); 145 1.1 mrg mpq_init (want_add); 146 1.1 mrg mpq_init (want_sub); 147 1.1 mrg 148 1.1 mrg for (i = 0; i < 500; i++) 149 1.1 mrg { 150 1.1 mrg mpz_errandomb (mpq_numref(x), rands, 512L); 151 1.1 mrg mpz_errandomb_nonzero (mpq_denref(x), rands, 512L); 152 1.1 mrg mpq_canonicalize (x); 153 1.1 mrg 154 1.1 mrg mpz_errandomb (mpq_numref(y), rands, 512L); 155 1.1 mrg mpz_errandomb_nonzero (mpq_denref(y), rands, 512L); 156 1.1 mrg mpq_canonicalize (y); 157 1.1 mrg 158 1.1 mrg refmpq_add (want_add, x, y); 159 1.1 mrg refmpq_sub (want_sub, x, y); 160 1.1 mrg 161 1.1 mrg check_all (x, y, want_add, want_sub); 162 1.1 mrg } 163 1.1 mrg 164 1.1 mrg mpq_clear (x); 165 1.1 mrg mpq_clear (y); 166 1.1 mrg mpq_clear (want_add); 167 1.1 mrg mpq_clear (want_sub); 168 1.1 mrg } 169 1.1 mrg 170 1.1 mrg 171 1.1 mrg int 172 1.1 mrg main (void) 173 1.1 mrg { 174 1.1 mrg tests_start (); 175 1.1 mrg 176 1.1 mrg check_data (); 177 1.1 mrg check_rand (); 178 1.1 mrg 179 1.1 mrg tests_end (); 180 1.1 mrg 181 1.1 mrg exit (0); 182 1.1 mrg } 183