(root)/
mpfr-4.2.1/
src/
set_d64.c
       1  /* mpfr_set_decimal64 -- convert an IEEE 754-2008 decimal64 float to
       2                           a multiple precision floating-point number
       3  
       4  See https://gcc.gnu.org/legacy-ml/gcc/2006-06/msg00691.html,
       5  https://gcc.gnu.org/onlinedocs/gcc/Decimal-Float.html,
       6  and TR 24732 <https://www.open-std.org/jtc1/sc22/wg14/www/projects#24732>.
       7  
       8  Copyright 2006-2023 Free Software Foundation, Inc.
       9  Contributed by the AriC and Caramba 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  https://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  #define MPFR_NEED_LONGLONG_H
      29  #include "mpfr-impl.h"
      30  
      31  #ifdef MPFR_WANT_DECIMAL_FLOATS
      32  
      33  #ifdef DECIMAL_DPD_FORMAT
      34    /* conversion 10-bits to 3 digits */
      35  static unsigned int T[1024] = {
      36    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 80, 81, 800, 801, 880, 881, 10, 11, 12, 13,
      37    14, 15, 16, 17, 18, 19, 90, 91, 810, 811, 890, 891, 20, 21, 22, 23, 24, 25,
      38    26, 27, 28, 29, 82, 83, 820, 821, 808, 809, 30, 31, 32, 33, 34, 35, 36, 37,
      39    38, 39, 92, 93, 830, 831, 818, 819, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
      40    84, 85, 840, 841, 88, 89, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 94, 95,
      41    850, 851, 98, 99, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 86, 87, 860, 861,
      42    888, 889, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 96, 97, 870, 871, 898,
      43    899, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 180, 181, 900, 901,
      44    980, 981, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 190, 191, 910,
      45    911, 990, 991, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 182, 183,
      46    920, 921, 908, 909, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 192,
      47    193, 930, 931, 918, 919, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
      48    184, 185, 940, 941, 188, 189, 150, 151, 152, 153, 154, 155, 156, 157, 158,
      49    159, 194, 195, 950, 951, 198, 199, 160, 161, 162, 163, 164, 165, 166, 167,
      50    168, 169, 186, 187, 960, 961, 988, 989, 170, 171, 172, 173, 174, 175, 176,
      51    177, 178, 179, 196, 197, 970, 971, 998, 999, 200, 201, 202, 203, 204, 205,
      52    206, 207, 208, 209, 280, 281, 802, 803, 882, 883, 210, 211, 212, 213, 214,
      53    215, 216, 217, 218, 219, 290, 291, 812, 813, 892, 893, 220, 221, 222, 223,
      54    224, 225, 226, 227, 228, 229, 282, 283, 822, 823, 828, 829, 230, 231, 232,
      55    233, 234, 235, 236, 237, 238, 239, 292, 293, 832, 833, 838, 839, 240, 241,
      56    242, 243, 244, 245, 246, 247, 248, 249, 284, 285, 842, 843, 288, 289, 250,
      57    251, 252, 253, 254, 255, 256, 257, 258, 259, 294, 295, 852, 853, 298, 299,
      58    260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 286, 287, 862, 863, 888,
      59    889, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 296, 297, 872, 873,
      60    898, 899, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 380, 381, 902,
      61    903, 982, 983, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 390, 391,
      62    912, 913, 992, 993, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 382,
      63    383, 922, 923, 928, 929, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339,
      64    392, 393, 932, 933, 938, 939, 340, 341, 342, 343, 344, 345, 346, 347, 348,
      65    349, 384, 385, 942, 943, 388, 389, 350, 351, 352, 353, 354, 355, 356, 357,
      66    358, 359, 394, 395, 952, 953, 398, 399, 360, 361, 362, 363, 364, 365, 366,
      67    367, 368, 369, 386, 387, 962, 963, 988, 989, 370, 371, 372, 373, 374, 375,
      68    376, 377, 378, 379, 396, 397, 972, 973, 998, 999, 400, 401, 402, 403, 404,
      69    405, 406, 407, 408, 409, 480, 481, 804, 805, 884, 885, 410, 411, 412, 413,
      70    414, 415, 416, 417, 418, 419, 490, 491, 814, 815, 894, 895, 420, 421, 422,
      71    423, 424, 425, 426, 427, 428, 429, 482, 483, 824, 825, 848, 849, 430, 431,
      72    432, 433, 434, 435, 436, 437, 438, 439, 492, 493, 834, 835, 858, 859, 440,
      73    441, 442, 443, 444, 445, 446, 447, 448, 449, 484, 485, 844, 845, 488, 489,
      74    450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 494, 495, 854, 855, 498,
      75    499, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 486, 487, 864, 865,
      76    888, 889, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 496, 497, 874,
      77    875, 898, 899, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 580, 581,
      78    904, 905, 984, 985, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 590,
      79    591, 914, 915, 994, 995, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529,
      80    582, 583, 924, 925, 948, 949, 530, 531, 532, 533, 534, 535, 536, 537, 538,
      81    539, 592, 593, 934, 935, 958, 959, 540, 541, 542, 543, 544, 545, 546, 547,
      82    548, 549, 584, 585, 944, 945, 588, 589, 550, 551, 552, 553, 554, 555, 556,
      83    557, 558, 559, 594, 595, 954, 955, 598, 599, 560, 561, 562, 563, 564, 565,
      84    566, 567, 568, 569, 586, 587, 964, 965, 988, 989, 570, 571, 572, 573, 574,
      85    575, 576, 577, 578, 579, 596, 597, 974, 975, 998, 999, 600, 601, 602, 603,
      86    604, 605, 606, 607, 608, 609, 680, 681, 806, 807, 886, 887, 610, 611, 612,
      87    613, 614, 615, 616, 617, 618, 619, 690, 691, 816, 817, 896, 897, 620, 621,
      88    622, 623, 624, 625, 626, 627, 628, 629, 682, 683, 826, 827, 868, 869, 630,
      89    631, 632, 633, 634, 635, 636, 637, 638, 639, 692, 693, 836, 837, 878, 879,
      90    640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 684, 685, 846, 847, 688,
      91    689, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 694, 695, 856, 857,
      92    698, 699, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 686, 687, 866,
      93    867, 888, 889, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 696, 697,
      94    876, 877, 898, 899, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 780,
      95    781, 906, 907, 986, 987, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719,
      96    790, 791, 916, 917, 996, 997, 720, 721, 722, 723, 724, 725, 726, 727, 728,
      97    729, 782, 783, 926, 927, 968, 969, 730, 731, 732, 733, 734, 735, 736, 737,
      98    738, 739, 792, 793, 936, 937, 978, 979, 740, 741, 742, 743, 744, 745, 746,
      99    747, 748, 749, 784, 785, 946, 947, 788, 789, 750, 751, 752, 753, 754, 755,
     100    756, 757, 758, 759, 794, 795, 956, 957, 798, 799, 760, 761, 762, 763, 764,
     101    765, 766, 767, 768, 769, 786, 787, 966, 967, 988, 989, 770, 771, 772, 773,
     102    774, 775, 776, 777, 778, 779, 796, 797, 976, 977, 998, 999 };
     103  #endif
     104  
     105  #if _MPFR_IEEE_FLOATS && !defined(DECIMAL_GENERIC_CODE)
     106  
     107  /* Convert d to a decimal string (one-to-one correspondence, no rounding).
     108     The string s needs to have at least 25 characters (with the final '\0'):
     109     * 1 for the sign '-'
     110     * 2 for the leading '0.'
     111     * 16 for the significand
     112     * 5 for the exponent (for example 'E-100')
     113     * 1 for the final '\0'
     114   */
     115  static void
     116  decimal64_to_string (char *s, _Decimal64 d)
     117  {
     118    union mpfr_ieee_double_extract x;
     119    union ieee_double_decimal64 y;
     120    char *t;
     121    unsigned int Gh; /* most 5 significant bits from combination field */
     122    int exp; /* exponent */
     123    unsigned int i;
     124  
     125  #ifdef DECIMAL_DPD_FORMAT
     126    unsigned int d0, d1, d2, d3, d4, d5;
     127  #else /* BID */
     128  #if GMP_NUMB_BITS >= 64
     129    mp_limb_t rp[2];
     130  #else
     131    unsigned long rp[2]; /* rp[0] and rp[1] should contain at least 32 bits */
     132  #endif
     133  #define NLIMBS (64 / GMP_NUMB_BITS)
     134    mp_limb_t sp[NLIMBS];
     135    mp_size_t sn;
     136  #endif
     137  
     138    /* end of declarations */
     139  
     140    /* Memory representation of the _Decimal64 argument. */
     141    MPFR_LOG_MSG (("d = { %02X, %02X, %02X, %02X, %02X, %02X, %02X, %02X }\n",
     142                   ((unsigned char *) &d)[0],
     143                   ((unsigned char *) &d)[1],
     144                   ((unsigned char *) &d)[2],
     145                   ((unsigned char *) &d)[3],
     146                   ((unsigned char *) &d)[4],
     147                   ((unsigned char *) &d)[5],
     148                   ((unsigned char *) &d)[6],
     149                   ((unsigned char *) &d)[7]));
     150  
     151    /* now convert BID or DPD to string */
     152    y.d64 = d;
     153    x.d = y.d;
     154    MPFR_LOG_MSG (("x = { .sig = %u, .exp = %u, "
     155                   ".manh = 0x%05lX = %lu, .manl = 0x%08lX = %lu }\n",
     156                   (unsigned int) x.s.sig, (unsigned int) x.s.exp,
     157                   (unsigned long) x.s.manh, (unsigned long) x.s.manh,
     158                   (unsigned long) x.s.manl, (unsigned long) x.s.manl));
     159    Gh = x.s.exp >> 6;
     160    if (Gh == 31)
     161      {
     162        sprintf (s, "NaN");
     163        return;
     164      }
     165    else if (Gh == 30)
     166      {
     167        if (x.s.sig == 0)
     168          sprintf (s, "Inf");
     169        else
     170          sprintf (s, "-Inf");
     171        return;
     172      }
     173    t = s;
     174    if (x.s.sig)
     175      *t++ = '-';
     176  
     177    /* both the decimal64 DPD and BID encodings consist of:
     178     * a sign bit of 1 bit
     179     * a combination field of 13=5+8 bits
     180     * a trailing significand field of 50 bits
     181     */
     182  #ifdef DECIMAL_DPD_FORMAT
     183    /* the most significant 5 bits of the combination field give the first digit
     184       of the significand, and leading bits of the biased exponent (0, 1, 2). */
     185    if (Gh < 24)
     186      {
     187        exp = (x.s.exp >> 1) & 768;
     188        d0 = Gh & 7; /* first digit is in 0..7 */
     189      }
     190    else
     191      {
     192        exp = (x.s.exp & 384) << 1;
     193        d0 = 8 | (Gh & 1); /* first digit is 8 or 9 */
     194      }
     195    exp |= (x.s.exp & 63) << 2;
     196    exp |= x.s.manh >> 18;
     197    d1 = (x.s.manh >> 8) & 1023;
     198    d2 = ((x.s.manh << 2) | (x.s.manl >> 30)) & 1023;
     199    d3 = (x.s.manl >> 20) & 1023;
     200    d4 = (x.s.manl >> 10) & 1023;
     201    d5 = x.s.manl & 1023;
     202    sprintf (t, "%1u%3u%3u%3u%3u%3u", d0, T[d1], T[d2], T[d3], T[d4], T[d5]);
     203    /* Warning: some characters may be blank */
     204    for (i = 0; i < 16; i++)
     205      if (t[i] == ' ')
     206        t[i] = '0';
     207    t += 16;
     208  #else /* BID */
     209    /* IEEE 754-2008 specifies that if the decoded significand exceeds the
     210       maximum, i.e. here if it is >= 10^16, then the value is zero. */
     211    if (Gh < 24)
     212      {
     213        /* the biased exponent E is formed from G[0] to G[9] and the
     214           significand from bits G[10] through the end of the decoding */
     215        exp = x.s.exp >> 1;
     216        /* manh has 20 bits, manl has 32 bits */
     217        rp[1] = ((x.s.exp & 1) << 20) | x.s.manh;
     218        rp[0] = x.s.manl;
     219      }
     220    else
     221      {
     222        /* the biased exponent is formed from G[2] to G[11] */
     223        exp = (x.s.exp & 511) << 1;
     224        rp[1] = x.s.manh;
     225        rp[0] = x.s.manl;
     226        exp |= rp[1] >> 19;
     227        rp[1] &= 524287; /* 2^19-1: cancel G[11] */
     228        rp[1] |= 2097152; /* add 2^21 */
     229      }
     230    /* now convert {rp, 2} to {sp, NLIMBS} */
     231  #if GMP_NUMB_BITS >= 64
     232    sp[0] = MPFR_LIMB(rp[0]) | MPFR_LIMB_LSHIFT(rp[1],32);
     233  #elif GMP_NUMB_BITS == 32
     234    sp[0] = rp[0];
     235    sp[1] = rp[1];
     236  #elif GMP_NUMB_BITS == 16
     237    sp[0] = MPFR_LIMB(rp[0]);
     238    sp[1] = MPFR_LIMB(rp[0] >> 16);
     239    sp[2] = MPFR_LIMB(rp[1]);
     240    sp[3] = MPFR_LIMB(rp[1] >> 16);
     241  #elif GMP_NUMB_BITS == 8
     242    sp[0] = MPFR_LIMB(rp[0]);
     243    sp[1] = MPFR_LIMB(rp[0] >> 8);
     244    sp[2] = MPFR_LIMB(rp[0] >> 16);
     245    sp[3] = MPFR_LIMB(rp[0] >> 24);
     246    sp[4] = MPFR_LIMB(rp[1]);
     247    sp[5] = MPFR_LIMB(rp[1] >> 8);
     248    sp[6] = MPFR_LIMB(rp[1] >> 16);
     249    sp[7] = MPFR_LIMB(rp[1] >> 24);
     250  #else
     251  #error "GMP_NUMB_BITS should be 8, 16, 32, or >= 64"
     252  #endif
     253    sn = NLIMBS;
     254    while (sn > 0 && sp[sn - 1] == 0)
     255      sn --;
     256    if (sn == 0)
     257      {
     258      zero:
     259        *t = 0;
     260        i = 1;
     261      }
     262    else
     263      {
     264        i = mpn_get_str ((unsigned char*) t, 10, sp, sn);
     265        if (i > 16) /* non-canonical encoding: return zero */
     266          goto zero;
     267      }
     268    /* convert the values from mpn_get_str (0, 1, ..., 9) to digits: */
     269    while (i-- > 0)
     270      *t++ += '0';
     271  #endif /* DPD or BID */
     272  
     273    exp -= 398; /* unbiased exponent: -398 = emin - (p-1) where
     274                   emin = 1-emax = 1-384 = -383 and p=16 */
     275    sprintf (t, "E%d", exp);
     276  }
     277  
     278  #else  /* portable version */
     279  
     280  #ifndef DEC64_MAX
     281  # define DEC64_MAX 9.999999999999999E384dd
     282  #endif
     283  
     284  static void
     285  decimal64_to_string (char *s, _Decimal64 d)
     286  {
     287    int sign = 0, n;
     288    int exp = 0;
     289  
     290    if (MPFR_UNLIKELY (DOUBLE_ISNAN (d))) /* NaN */
     291      {
     292        /* we don't propagate the sign bit */
     293        sprintf (s, "NaN"); /* sprintf puts a final '\0' */
     294        return;
     295      }
     296    else if (MPFR_UNLIKELY (d > DEC64_MAX)) /* +Inf */
     297      {
     298        sprintf (s, "Inf");
     299        return;
     300      }
     301    else if (MPFR_UNLIKELY (d < -DEC64_MAX)) /* -Inf */
     302      {
     303        sprintf (s, "-Inf");
     304        return;
     305      }
     306  
     307    /* now d is neither NaN nor +Inf nor -Inf */
     308  
     309    if (d < (_Decimal64) 0.0)
     310      {
     311        sign = 1;
     312        d = -d;
     313      }
     314    else if (d == (_Decimal64) -0.0)
     315      { /* Warning: the comparison d == -0.0 returns true for d = 0.0 too,
     316           copy code from set_d.c here. We first compare to the +0.0 bitstring,
     317           in case +0.0 and -0.0 are represented identically. */
     318        double dd = (double) d, poszero = +0.0, negzero = DBL_NEG_ZERO;
     319        if (memcmp (&dd, &poszero, sizeof(double)) != 0 &&
     320            memcmp (&dd, &negzero, sizeof(double)) == 0)
     321          {
     322            sign = 1;
     323            d = -d;
     324          }
     325      }
     326  
     327    /* now normalize d in [0.1, 1[ */
     328    if (d >= (_Decimal64) 1.0)
     329      {
     330        _Decimal64 ten16 = (double) 1e16; /* 10^16 is exactly representable
     331                                             in binary64 */
     332        _Decimal64 ten32 = ten16 * ten16;
     333        _Decimal64 ten64 = ten32 * ten32;
     334        _Decimal64 ten128 = ten64 * ten64;
     335        _Decimal64 ten256 = ten128 * ten128;
     336  
     337        if (d >= ten256)
     338          {
     339            d /= ten256;
     340            exp += 256;
     341          }
     342        if (d >= ten128)
     343          {
     344            d /= ten128;
     345            exp += 128;
     346          }
     347        if (d >= ten64)
     348          {
     349            d /= ten64;
     350            exp += 64;
     351          }
     352        if (d >= ten32)
     353          {
     354            d /= ten32;
     355            exp += 32;
     356          }
     357        if (d >= (_Decimal64) 10000000000000000.0)
     358          {
     359            d /= (_Decimal64) 10000000000000000.0;
     360            exp += 16;
     361          }
     362        if (d >= (_Decimal64) 100000000.0)
     363          {
     364            d /= (_Decimal64) 100000000.0;
     365            exp += 8;
     366          }
     367        if (d >= (_Decimal64) 10000.0)
     368          {
     369            d /= (_Decimal64) 10000.0;
     370            exp += 4;
     371          }
     372        if (d >= (_Decimal64) 100.0)
     373          {
     374            d /= (_Decimal64) 100.0;
     375            exp += 2;
     376          }
     377        if (d >= (_Decimal64) 10.0)
     378          {
     379            d /= (_Decimal64) 10.0;
     380            exp += 1;
     381          }
     382        if (d >= (_Decimal64) 1.0)
     383          {
     384            d /= (_Decimal64) 10.0;
     385            exp += 1;
     386          }
     387      }
     388    else /* d < 1.0 */
     389      {
     390        _Decimal64 ten16, ten32, ten64, ten128, ten256;
     391  
     392        ten16 = (double) 1e16; /* 10^16 is exactly representable in binary64 */
     393        ten16 = (_Decimal64) 1.0 / ten16; /* 10^(-16), exact */
     394        ten32 = ten16 * ten16;
     395        ten64 = ten32 * ten32;
     396        ten128 = ten64 * ten64;
     397        ten256 = ten128 * ten128;
     398  
     399        if (d < ten256)
     400          {
     401            d /= ten256;
     402            exp -= 256;
     403          }
     404        if (d < ten128)
     405          {
     406            d /= ten128;
     407            exp -= 128;
     408          }
     409        if (d < ten64)
     410          {
     411            d /= ten64;
     412            exp -= 64;
     413          }
     414        if (d < ten32)
     415          {
     416            d /= ten32;
     417            exp -= 32;
     418          }
     419        /* the double constant 0.0000000000000001 is 2028240960365167/2^104,
     420           which should be rounded to 1e-16 in _Decimal64 */
     421        if (d < (_Decimal64) 0.0000000000000001)
     422          {
     423            d *= (_Decimal64) 10000000000000000.0;
     424            exp -= 16;
     425          }
     426        /* the double constant 0.00000001 is 3022314549036573/2^78,
     427           which should be rounded to 1e-8 in _Decimal64 */
     428        if (d < (_Decimal64) 0.00000001)
     429          {
     430            d *= (_Decimal64) 100000000.0;
     431            exp -= 8;
     432          }
     433        /* the double constant 0.0001 is 7378697629483821/2^66,
     434           which should be rounded to 1e-4 in _Decimal64 */
     435        if (d < (_Decimal64) 0.0001)
     436          {
     437            d *= (_Decimal64) 10000.0;
     438            exp -= 4;
     439          }
     440        /* the double constant 0.01 is 5764607523034235/2^59,
     441           which should be rounded to 1e-2 in _Decimal64 */
     442        if (d < (_Decimal64) 0.01)
     443          {
     444            d *= (_Decimal64) 100.0;
     445            exp -= 2;
     446          }
     447        /* the double constant 0.1 is 3602879701896397/2^55,
     448           which should be rounded to 1e-1 in _Decimal64 */
     449        if (d < (_Decimal64) 0.1)
     450          {
     451            d *= (_Decimal64) 10.0;
     452            exp -= 1;
     453          }
     454      }
     455  
     456    /* now 0.1 <= d < 1 */
     457    if (sign == 1)
     458      *s++ = '-';
     459    *s++ = '0';
     460    *s++ = '.';
     461    for (n = 0; n < 16; n++)
     462      {
     463        double e;
     464        int r;
     465  
     466        d *= (_Decimal64) 10.0;
     467        e = (double) d;
     468        r = (int) e;
     469        *s++ = '0' + r;
     470        d -= (_Decimal64) r;
     471      }
     472    MPFR_ASSERTN(d == (_Decimal64) 0.0);
     473    if (exp != 0)
     474      sprintf (s, "E%d", exp); /* adds a final '\0' */
     475    else
     476      *s = '\0';
     477  }
     478  
     479  #endif  /* definition of decimal64_to_string (DPD, BID, or portable) */
     480  
     481  /* the IEEE754-2008 decimal64 format has 16 digits, with emax=384,
     482     emin=1-emax=-383 */
     483  int
     484  mpfr_set_decimal64 (mpfr_ptr r, _Decimal64 d, mpfr_rnd_t rnd_mode)
     485  {
     486    char s[25]; /* need 1 character for sign,
     487                        2 characters for '0.'
     488                       16 characters for significand,
     489                        1 character for exponent 'E',
     490                        4 characters for exponent (including sign),
     491                        1 character for terminating \0. */
     492  
     493    decimal64_to_string (s, d);
     494    MPFR_LOG_MSG (("string: %s\n", s));
     495    return mpfr_strtofr (r, s, NULL, 10, rnd_mode);
     496  }
     497  
     498  #endif /* MPFR_WANT_DECIMAL_FLOATS */