1 1.1 mrg /* Test mpq_set_f. 2 1.1 mrg 3 1.1 mrg Copyright 2000, 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 <stdio.h> 21 1.1 mrg #include <stdlib.h> 22 1.1 mrg #include "gmp-impl.h" 23 1.1 mrg #include "tests.h" 24 1.1 mrg 25 1.1 mrg int 26 1.1 mrg main (int argc, char **argv) 27 1.1 mrg { 28 1.1 mrg #if GMP_NAIL_BITS == 0 29 1.1 mrg static const struct { 30 1.1 mrg int f_base; 31 1.1 mrg const char *f; 32 1.1 mrg int z_base; 33 1.1 mrg const char *want_num; 34 1.1 mrg const char *want_den; 35 1.1 mrg 36 1.1 mrg } data[] = { 37 1.1 mrg 38 1.1 mrg { -2, "0", 16, "0", "1" }, 39 1.1 mrg { -2, "1", 16, "1", "1" }, 40 1.1 mrg { -2, "1@1", 16, "2", "1" }, 41 1.1 mrg { -2, "1@2", 16, "4", "1" }, 42 1.1 mrg { -2, "1@3", 16, "8", "1" }, 43 1.1 mrg 44 1.1 mrg { -2, "1@30", 16, "40000000", "1" }, 45 1.1 mrg { -2, "1@31", 16, "80000000", "1" }, 46 1.1 mrg { -2, "1@32", 16, "100000000", "1" }, 47 1.1 mrg { -2, "1@33", 16, "200000000", "1" }, 48 1.1 mrg { -2, "1@34", 16, "400000000", "1" }, 49 1.1 mrg 50 1.1 mrg { -2, "1@62", 16, "4000000000000000", "1" }, 51 1.1 mrg { -2, "1@63", 16, "8000000000000000", "1" }, 52 1.1 mrg { -2, "1@64", 16, "10000000000000000", "1" }, 53 1.1 mrg { -2, "1@65", 16, "20000000000000000", "1" }, 54 1.1 mrg { -2, "1@66", 16, "40000000000000000", "1" }, 55 1.1 mrg 56 1.1 mrg { -2, "1@126", 16, "40000000000000000000000000000000", "1" }, 57 1.1 mrg { -2, "1@127", 16, "80000000000000000000000000000000", "1" }, 58 1.1 mrg { -2, "1@128", 16, "100000000000000000000000000000000", "1" }, 59 1.1 mrg { -2, "1@129", 16, "200000000000000000000000000000000", "1" }, 60 1.1 mrg { -2, "1@130", 16, "400000000000000000000000000000000", "1" }, 61 1.1 mrg 62 1.1 mrg { -2, "1@-1", 16, "1", "2" }, 63 1.1 mrg { -2, "1@-2", 16, "1", "4" }, 64 1.1 mrg { -2, "1@-3", 16, "1", "8" }, 65 1.1 mrg 66 1.1 mrg { -2, "1@-30", 16, "1", "40000000" }, 67 1.1 mrg { -2, "1@-31", 16, "1", "80000000" }, 68 1.1 mrg { -2, "1@-32", 16, "1", "100000000" }, 69 1.1 mrg { -2, "1@-33", 16, "1", "200000000" }, 70 1.1 mrg { -2, "1@-34", 16, "1", "400000000" }, 71 1.1 mrg 72 1.1 mrg { -2, "1@-62", 16, "1", "4000000000000000" }, 73 1.1 mrg { -2, "1@-63", 16, "1", "8000000000000000" }, 74 1.1 mrg { -2, "1@-64", 16, "1", "10000000000000000" }, 75 1.1 mrg { -2, "1@-65", 16, "1", "20000000000000000" }, 76 1.1 mrg { -2, "1@-66", 16, "1", "40000000000000000" }, 77 1.1 mrg 78 1.1 mrg { -2, "1@-126", 16, "1", "40000000000000000000000000000000" }, 79 1.1 mrg { -2, "1@-127", 16, "1", "80000000000000000000000000000000" }, 80 1.1 mrg { -2, "1@-128", 16, "1", "100000000000000000000000000000000" }, 81 1.1 mrg { -2, "1@-129", 16, "1", "200000000000000000000000000000000" }, 82 1.1 mrg { -2, "1@-130", 16, "1", "400000000000000000000000000000000" }, 83 1.1 mrg 84 1.1 mrg { -2, "1@-30", 16, "1", "40000000" }, 85 1.1 mrg { -2, "1@-31", 16, "1", "80000000" }, 86 1.1 mrg { -2, "1@-32", 16, "1", "100000000" }, 87 1.1 mrg { -2, "1@-33", 16, "1", "200000000" }, 88 1.1 mrg { -2, "1@-34", 16, "1", "400000000" }, 89 1.1 mrg 90 1.1 mrg { -2, "11@-62", 16, "3", "4000000000000000" }, 91 1.1 mrg { -2, "11@-63", 16, "3", "8000000000000000" }, 92 1.1 mrg { -2, "11@-64", 16, "3", "10000000000000000" }, 93 1.1 mrg { -2, "11@-65", 16, "3", "20000000000000000" }, 94 1.1 mrg { -2, "11@-66", 16, "3", "40000000000000000" }, 95 1.1 mrg 96 1.1 mrg { 16, "80000000.00000001", 16, "8000000000000001", "100000000" }, 97 1.1 mrg { 16, "80000000.00000008", 16, "1000000000000001", "20000000" }, 98 1.1 mrg { 16, "80000000.8", 16, "100000001", "2" }, 99 1.1 mrg 100 1.1 mrg }; 101 1.1 mrg 102 1.1 mrg mpf_t f; 103 1.1 mrg mpq_t got; 104 1.1 mrg mpz_t want_num, want_den; 105 1.1 mrg int i, neg; 106 1.1 mrg 107 1.1 mrg tests_start (); 108 1.1 mrg 109 1.1 mrg mpf_init2 (f, 1024L); 110 1.1 mrg mpq_init (got); 111 1.1 mrg mpz_init (want_num); 112 1.1 mrg mpz_init (want_den); 113 1.1 mrg 114 1.1 mrg for (i = 0; i < numberof (data); i++) 115 1.1 mrg { 116 1.1 mrg for (neg = 0; neg <= 1; neg++) 117 1.1 mrg { 118 1.1 mrg mpf_set_str_or_abort (f, data[i].f, data[i].f_base); 119 1.1 mrg mpz_set_str_or_abort (want_num, data[i].want_num, data[i].z_base); 120 1.1 mrg mpz_set_str_or_abort (want_den, data[i].want_den, data[i].z_base); 121 1.1 mrg 122 1.1 mrg if (neg) 123 1.1 mrg { 124 1.1 mrg mpf_neg (f, f); 125 1.1 mrg mpz_neg (want_num, want_num); 126 1.1 mrg } 127 1.1 mrg 128 1.1 mrg mpq_set_f (got, f); 129 1.1 mrg MPQ_CHECK_FORMAT (got); 130 1.1 mrg 131 1.1 mrg if (mpz_cmp (mpq_numref(got), want_num) != 0 132 1.1 mrg || mpz_cmp (mpq_denref(got), want_den) != 0) 133 1.1 mrg { 134 1.1 mrg printf ("wrong at data[%d]\n", i); 135 1.1 mrg printf (" f_base %d, z_base %d\n", 136 1.1 mrg data[i].f_base, data[i].z_base); 137 1.1 mrg 138 1.1 mrg printf (" f \"%s\" hex ", data[i].f); 139 1.1 mrg mpf_out_str (stdout, 16, 0, f); 140 1.1 mrg printf ("\n"); 141 1.1 mrg 142 1.1 mrg printf (" want num 0x"); 143 1.1 mrg mpz_out_str (stdout, 16, want_num); 144 1.1 mrg printf ("\n"); 145 1.1 mrg printf (" want den 0x"); 146 1.1 mrg mpz_out_str (stdout, 16, want_den); 147 1.1 mrg printf ("\n"); 148 1.1 mrg 149 1.1 mrg printf (" got num 0x"); 150 1.1 mrg mpz_out_str (stdout, 16, mpq_numref(got)); 151 1.1 mrg printf ("\n"); 152 1.1 mrg printf (" got den 0x"); 153 1.1 mrg mpz_out_str (stdout, 16, mpq_denref(got)); 154 1.1 mrg printf ("\n"); 155 1.1 mrg 156 1.1 mrg abort (); 157 1.1 mrg } 158 1.1 mrg } 159 1.1 mrg } 160 1.1 mrg 161 1.1 mrg mpf_clear (f); 162 1.1 mrg mpq_clear (got); 163 1.1 mrg mpz_clear (want_num); 164 1.1 mrg mpz_clear (want_den); 165 1.1 mrg 166 1.1 mrg tests_end (); 167 1.1 mrg #endif 168 1.1 mrg exit (0); 169 1.1 mrg } 170