1 /* mpfr_get_decimal64 -- convert a multiple precision floating-point number 2 to a IEEE 754r decimal64 float 3 4 See http://gcc.gnu.org/ml/gcc/2006-06/msg00691.html, 5 http://gcc.gnu.org/onlinedocs/gcc/Decimal-Float.html, 6 and TR 24732 <http://www.open-std.org/jtc1/sc22/wg14/www/projects#24732>. 7 8 Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 9 Contributed by the Arenaire and Caramel projects, INRIA. 10 11 This file is part of the GNU MPFR Library. 12 13 The GNU MPFR Library is free software; you can redistribute it and/or modify 14 it under the terms of the GNU Lesser General Public License as published by 15 the Free Software Foundation; either version 3 of the License, or (at your 16 option) any later version. 17 18 The GNU MPFR Library is distributed in the hope that it will be useful, but 19 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 20 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 21 License for more details. 22 23 You should have received a copy of the GNU Lesser General Public License 24 along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 25 http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 26 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 27 28 #include <stdlib.h> /* for strtol */ 29 #include "mpfr-impl.h" 30 31 #define ISDIGIT(c) ('0' <= c && c <= '9') 32 33 #ifdef MPFR_WANT_DECIMAL_FLOATS 34 35 #ifdef DPD_FORMAT 36 static int T[1000] = { 37 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, 38 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 39 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 80, 81, 82, 83, 84, 85, 86, 87, 88, 40 89, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 112, 113, 114, 115, 116, 41 117, 118, 119, 120, 121, 10, 11, 42, 43, 74, 75, 106, 107, 78, 79, 26, 27, 42 58, 59, 90, 91, 122, 123, 94, 95, 128, 129, 130, 131, 132, 133, 134, 135, 43 136, 137, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 160, 161, 162, 44 163, 164, 165, 166, 167, 168, 169, 176, 177, 178, 179, 180, 181, 182, 183, 45 184, 185, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 208, 209, 210, 46 211, 212, 213, 214, 215, 216, 217, 224, 225, 226, 227, 228, 229, 230, 231, 47 232, 233, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 138, 139, 170, 48 171, 202, 203, 234, 235, 206, 207, 154, 155, 186, 187, 218, 219, 250, 251, 49 222, 223, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 272, 273, 274, 50 275, 276, 277, 278, 279, 280, 281, 288, 289, 290, 291, 292, 293, 294, 295, 51 296, 297, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 320, 321, 322, 52 323, 324, 325, 326, 327, 328, 329, 336, 337, 338, 339, 340, 341, 342, 343, 53 344, 345, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 368, 369, 370, 54 371, 372, 373, 374, 375, 376, 377, 266, 267, 298, 299, 330, 331, 362, 363, 55 334, 335, 282, 283, 314, 315, 346, 347, 378, 379, 350, 351, 384, 385, 386, 56 387, 388, 389, 390, 391, 392, 393, 400, 401, 402, 403, 404, 405, 406, 407, 57 408, 409, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 432, 433, 434, 58 435, 436, 437, 438, 439, 440, 441, 448, 449, 450, 451, 452, 453, 454, 455, 59 456, 457, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 480, 481, 482, 60 483, 484, 485, 486, 487, 488, 489, 496, 497, 498, 499, 500, 501, 502, 503, 61 504, 505, 394, 395, 426, 427, 458, 459, 490, 491, 462, 463, 410, 411, 442, 62 443, 474, 475, 506, 507, 478, 479, 512, 513, 514, 515, 516, 517, 518, 519, 63 520, 521, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 544, 545, 546, 64 547, 548, 549, 550, 551, 552, 553, 560, 561, 562, 563, 564, 565, 566, 567, 65 568, 569, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 592, 593, 594, 66 595, 596, 597, 598, 599, 600, 601, 608, 609, 610, 611, 612, 613, 614, 615, 67 616, 617, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 522, 523, 554, 68 555, 586, 587, 618, 619, 590, 591, 538, 539, 570, 571, 602, 603, 634, 635, 69 606, 607, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 656, 657, 658, 70 659, 660, 661, 662, 663, 664, 665, 672, 673, 674, 675, 676, 677, 678, 679, 71 680, 681, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 704, 705, 706, 72 707, 708, 709, 710, 711, 712, 713, 720, 721, 722, 723, 724, 725, 726, 727, 73 728, 729, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 752, 753, 754, 74 755, 756, 757, 758, 759, 760, 761, 650, 651, 682, 683, 714, 715, 746, 747, 75 718, 719, 666, 667, 698, 699, 730, 731, 762, 763, 734, 735, 768, 769, 770, 76 771, 772, 773, 774, 775, 776, 777, 784, 785, 786, 787, 788, 789, 790, 791, 77 792, 793, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 816, 817, 818, 78 819, 820, 821, 822, 823, 824, 825, 832, 833, 834, 835, 836, 837, 838, 839, 79 840, 841, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 864, 865, 866, 80 867, 868, 869, 870, 871, 872, 873, 880, 881, 882, 883, 884, 885, 886, 887, 81 888, 889, 778, 779, 810, 811, 842, 843, 874, 875, 846, 847, 794, 795, 826, 82 827, 858, 859, 890, 891, 862, 863, 896, 897, 898, 899, 900, 901, 902, 903, 83 904, 905, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 928, 929, 930, 84 931, 932, 933, 934, 935, 936, 937, 944, 945, 946, 947, 948, 949, 950, 951, 85 952, 953, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 976, 977, 978, 86 979, 980, 981, 982, 983, 984, 985, 992, 993, 994, 995, 996, 997, 998, 999, 87 1000, 1001, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 906, 88 907, 938, 939, 970, 971, 1002, 1003, 974, 975, 922, 923, 954, 955, 986, 89 987, 1018, 1019, 990, 991, 12, 13, 268, 269, 524, 525, 780, 781, 46, 47, 28, 90 29, 284, 285, 540, 541, 796, 797, 62, 63, 44, 45, 300, 301, 556, 557, 812, 91 813, 302, 303, 60, 61, 316, 317, 572, 573, 828, 829, 318, 319, 76, 77, 92 332, 333, 588, 589, 844, 845, 558, 559, 92, 93, 348, 349, 604, 605, 860, 93 861, 574, 575, 108, 109, 364, 365, 620, 621, 876, 877, 814, 815, 124, 125, 94 380, 381, 636, 637, 892, 893, 830, 831, 14, 15, 270, 271, 526, 527, 782, 95 783, 110, 111, 30, 31, 286, 287, 542, 543, 798, 799, 126, 127, 140, 141, 96 396, 397, 652, 653, 908, 909, 174, 175, 156, 157, 412, 413, 668, 669, 924, 97 925, 190, 191, 172, 173, 428, 429, 684, 685, 940, 941, 430, 431, 188, 189, 98 444, 445, 700, 701, 956, 957, 446, 447, 204, 205, 460, 461, 716, 717, 972, 99 973, 686, 687, 220, 221, 476, 477, 732, 733, 988, 989, 702, 703, 236, 237, 100 492, 493, 748, 749, 1004, 1005, 942, 943, 252, 253, 508, 509, 764, 765, 101 1020, 1021, 958, 959, 142, 143, 398, 399, 654, 655, 910, 911, 238, 239, 158, 102 159, 414, 415, 670, 671, 926, 927, 254, 255}; 103 #endif 104 105 /* construct a decimal64 NaN */ 106 static _Decimal64 107 get_decimal64_nan (void) 108 { 109 union ieee_double_extract x; 110 union ieee_double_decimal64 y; 111 112 x.s.exp = 1984; /* G[0]..G[4] = 11111: quiet NaN */ 113 y.d = x.d; 114 return y.d64; 115 } 116 117 /* construct the decimal64 Inf with given sign */ 118 static _Decimal64 119 get_decimal64_inf (int negative) 120 { 121 union ieee_double_extract x; 122 union ieee_double_decimal64 y; 123 124 x.s.sig = (negative) ? 1 : 0; 125 x.s.exp = 1920; /* G[0]..G[4] = 11110: Inf */ 126 y.d = x.d; 127 return y.d64; 128 } 129 130 /* construct the decimal64 zero with given sign */ 131 static _Decimal64 132 get_decimal64_zero (int negative) 133 { 134 union ieee_double_decimal64 y; 135 136 /* zero has the same representation in binary64 and decimal64 */ 137 y.d = negative ? DBL_NEG_ZERO : 0.0; 138 return y.d64; 139 } 140 141 /* construct the decimal64 smallest non-zero with given sign */ 142 static _Decimal64 143 get_decimal64_min (int negative) 144 { 145 union ieee_double_extract x; 146 147 x.s.sig = (negative) ? 1 : 0; 148 x.s.exp = 0; 149 x.s.manh = 0; 150 x.s.manl = 1; 151 return x.d; 152 } 153 154 /* construct the decimal64 largest finite number with given sign */ 155 static _Decimal64 156 get_decimal64_max (int negative) 157 { 158 union ieee_double_extract x; 159 160 x.s.sig = (negative) ? 1 : 0; 161 x.s.exp = 1919; 162 x.s.manh = 1048575; /* 2^20-1 */ 163 x.s.manl = ~0; 164 return x.d; 165 } 166 167 /* one-to-one conversion: 168 s is a decimal string representing a number x = m * 10^e which must be 169 exactly representable in the decimal64 format, i.e. 170 (a) the mantissa m has at most 16 decimal digits 171 (b1) -383 <= e <= 384 with m integer multiple of 10^(-15), |m| < 10 172 (b2) or -398 <= e <= 369 with m integer, |m| < 10^16. 173 Assumes s is neither NaN nor +Inf nor -Inf. 174 */ 175 static _Decimal64 176 string_to_Decimal64 (char *s) 177 { 178 long int exp = 0; 179 char m[17]; 180 long n = 0; /* mantissa length */ 181 char *endptr[1]; 182 union ieee_double_extract x; 183 union ieee_double_decimal64 y; 184 #ifdef DPD_FORMAT 185 unsigned int G, d1, d2, d3, d4, d5; 186 #endif 187 188 /* read sign */ 189 if (*s == '-') 190 { 191 x.s.sig = 1; 192 s ++; 193 } 194 else 195 x.s.sig = 0; 196 /* read mantissa */ 197 while (ISDIGIT (*s)) 198 m[n++] = *s++; 199 exp = n; 200 if (*s == '.') 201 { 202 s ++; 203 while (ISDIGIT (*s)) 204 m[n++] = *s++; 205 } 206 /* we have exp digits before decimal point, and a total of n digits */ 207 exp -= n; /* we will consider an integer mantissa */ 208 MPFR_ASSERTN(n <= 16); 209 if (*s == 'E' || *s == 'e') 210 exp += strtol (s + 1, endptr, 10); 211 else 212 *endptr = s; 213 MPFR_ASSERTN(**endptr == '\0'); 214 MPFR_ASSERTN(-398 <= exp && exp <= (long) (385 - n)); 215 while (n < 16) 216 { 217 m[n++] = '0'; 218 exp --; 219 } 220 /* now n=16 and -398 <= exp <= 369 */ 221 m[n] = '\0'; 222 223 /* compute biased exponent */ 224 exp += 398; 225 226 MPFR_ASSERTN(exp >= -15); 227 if (exp < 0) 228 { 229 int i; 230 n = -exp; 231 /* check the last n digits of the mantissa are zero */ 232 for (i = 1; i <= n; i++) 233 MPFR_ASSERTN(m[16 - n] == '0'); 234 /* shift the first (16-n) digits to the right */ 235 for (i = 16 - n - 1; i >= 0; i--) 236 m[i + n] = m[i]; 237 /* zero the first n digits */ 238 for (i = 0; i < n; i ++) 239 m[i] = '0'; 240 exp = 0; 241 } 242 243 /* now convert to DPD or BID */ 244 #ifdef DPD_FORMAT 245 #define CH(d) (d - '0') 246 if (m[0] >= '8') 247 G = (3 << 11) | ((exp & 768) << 1) | ((CH(m[0]) & 1) << 8); 248 else 249 G = ((exp & 768) << 3) | (CH(m[0]) << 8); 250 /* now the most 5 significant bits of G are filled */ 251 G |= exp & 255; 252 d1 = T[100 * CH(m[1]) + 10 * CH(m[2]) + CH(m[3])]; /* 10-bit encoding */ 253 d2 = T[100 * CH(m[4]) + 10 * CH(m[5]) + CH(m[6])]; /* 10-bit encoding */ 254 d3 = T[100 * CH(m[7]) + 10 * CH(m[8]) + CH(m[9])]; /* 10-bit encoding */ 255 d4 = T[100 * CH(m[10]) + 10 * CH(m[11]) + CH(m[12])]; /* 10-bit encoding */ 256 d5 = T[100 * CH(m[13]) + 10 * CH(m[14]) + CH(m[15])]; /* 10-bit encoding */ 257 x.s.exp = G >> 2; 258 x.s.manh = ((G & 3) << 18) | (d1 << 8) | (d2 >> 2); 259 x.s.manl = (d2 & 3) << 30; 260 x.s.manl |= (d3 << 20) | (d4 << 10) | d5; 261 #else /* BID format */ 262 { 263 mp_size_t rn; 264 mp_limb_t rp[2]; 265 int case_i = strcmp (m, "9007199254740992") < 0; 266 267 for (n = 0; n < 16; n++) 268 m[n] -= '0'; 269 rn = mpn_set_str (rp, (unsigned char *) m, 16, 10); 270 if (rn == 1) 271 rp[1] = 0; 272 #if GMP_NUMB_BITS > 32 273 rp[1] = rp[1] << (GMP_NUMB_BITS - 32); 274 rp[1] |= rp[0] >> 32; 275 rp[0] &= 4294967295UL; 276 #endif 277 if (case_i) 278 { /* s < 2^53: case i) */ 279 x.s.exp = exp << 1; 280 x.s.manl = rp[0]; /* 32 bits */ 281 x.s.manh = rp[1] & 1048575; /* 20 low bits */ 282 x.s.exp |= rp[1] >> 20; /* 1 bit */ 283 } 284 else /* s >= 2^53: case ii) */ 285 { 286 x.s.exp = 1536 | (exp >> 1); 287 x.s.manl = rp[0]; 288 x.s.manh = (rp[1] ^ 2097152) | ((exp & 1) << 19); 289 } 290 } 291 #endif /* DPD_FORMAT */ 292 y.d = x.d; 293 return y.d64; 294 } 295 296 _Decimal64 297 mpfr_get_decimal64 (mpfr_srcptr src, mpfr_rnd_t rnd_mode) 298 { 299 int negative; 300 mpfr_exp_t e; 301 302 /* the encoding of NaN, Inf, zero is the same under DPD or BID */ 303 if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (src))) 304 { 305 if (MPFR_IS_NAN (src)) 306 return get_decimal64_nan (); 307 308 negative = MPFR_IS_NEG (src); 309 310 if (MPFR_IS_INF (src)) 311 return get_decimal64_inf (negative); 312 313 MPFR_ASSERTD (MPFR_IS_ZERO(src)); 314 return get_decimal64_zero (negative); 315 } 316 317 e = MPFR_GET_EXP (src); 318 negative = MPFR_IS_NEG (src); 319 320 if (MPFR_UNLIKELY(rnd_mode == MPFR_RNDA)) 321 rnd_mode = negative ? MPFR_RNDD : MPFR_RNDU; 322 323 /* the smallest decimal64 number is 10^(-398), 324 with 2^(-1323) < 10^(-398) < 2^(-1322) */ 325 if (MPFR_UNLIKELY (e < -1323)) /* src <= 2^(-1324) < 1/2*10^(-398) */ 326 { 327 if (rnd_mode == MPFR_RNDZ || rnd_mode == MPFR_RNDN 328 || (rnd_mode == MPFR_RNDD && negative == 0) 329 || (rnd_mode == MPFR_RNDU && negative != 0)) 330 return get_decimal64_zero (negative); 331 else /* return the smallest non-zero number */ 332 return get_decimal64_min (negative); 333 } 334 /* the largest decimal64 number is just below 10^(385) < 2^1279 */ 335 else if (MPFR_UNLIKELY (e > 1279)) /* then src >= 2^1279 */ 336 { 337 if (MPFR_RNDZ || (rnd_mode == MPFR_RNDU && negative != 0) 338 || (rnd_mode == MPFR_RNDD && negative == 0)) 339 return get_decimal64_max (negative); 340 else 341 return get_decimal64_inf (negative); 342 } 343 else 344 { 345 /* we need to store the sign (1), the mantissa (16), and the terminating 346 character, thus we need at least 18 characters in s */ 347 char s[23]; 348 mpfr_get_str (s, &e, 10, 16, src, rnd_mode); 349 /* the smallest normal number is 1.000...000E-383, 350 which corresponds to s=[0.]1000...000 and e=-382 */ 351 if (e < -382) 352 { 353 /* the smallest subnormal number is 0.000...001E-383 = 1E-398, 354 which corresponds to s=[0.]1000...000 and e=-397 */ 355 if (e < -397) 356 { 357 if (rnd_mode == MPFR_RNDZ || rnd_mode == MPFR_RNDN 358 || (rnd_mode == MPFR_RNDD && negative == 0) 359 || (rnd_mode == MPFR_RNDU && negative != 0)) 360 return get_decimal64_zero (negative); 361 else /* return the smallest non-zero number */ 362 return get_decimal64_min (negative); 363 } 364 else 365 { 366 mpfr_exp_t e2; 367 long digits = 16 - (-382 - e); 368 /* if e = -397 then 16 - (-382 - e) = 1 */ 369 mpfr_get_str (s, &e2, 10, digits, src, rnd_mode); 370 /* Warning: we can have e2 = e + 1 here, when rounding to 371 nearest or away from zero. */ 372 s[negative + digits] = 'E'; 373 sprintf (s + negative + digits + 1, "%ld", 374 (long int)e2 - digits); 375 return string_to_Decimal64 (s); 376 } 377 } 378 /* the largest number is 9.999...999E+384, 379 which corresponds to s=[0.]9999...999 and e=385 */ 380 else if (e > 385) 381 { 382 if (MPFR_RNDZ || (rnd_mode == MPFR_RNDU && negative != 0) 383 || (rnd_mode == MPFR_RNDD && negative == 0)) 384 return get_decimal64_max (negative); 385 else 386 return get_decimal64_inf (negative); 387 } 388 else /* -382 <= e <= 385 */ 389 { 390 s[16 + negative] = 'E'; 391 sprintf (s + 17 + negative, "%ld", (long int)e - 16); 392 return string_to_Decimal64 (s); 393 } 394 } 395 } 396 397 #endif /* MPFR_WANT_DECIMAL_FLOATS */ 398