1 /* mpfr_strtofr -- set a floating-point number from a string
3 Copyright 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
4 Contributed by the Arenaire and Cacao projects, INRIA.
6 This file is part of the GNU MPFR Library.
8 The GNU MPFR Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or (at your
11 option) any later version.
13 The GNU MPFR Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MPFR Library; see the file COPYING.LIB. If not, write to
20 the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
21 MA 02110-1301, USA. */
23 #include <stdlib.h> /* For strtol */
24 #include <ctype.h> /* For isspace */
26 #define MPFR_NEED_LONGLONG_H
27 #include "mpfr-impl.h"
29 #define MPFR_MAX_BASE 62
31 struct parsed_string {
32 int negative; /* non-zero iff the number is negative */
33 int base; /* base of the string */
34 unsigned char *mantissa; /* raw significand (without any point) */
35 unsigned char *mant; /* stripped significand (without starting and
37 size_t prec; /* length of mant (zero for +/-0) */
38 size_t alloc; /* allocation size of mantissa */
39 mp_exp_t exp_base; /* number of digits before the point */
40 mp_exp_t exp_bin; /* exponent in case base=2 or 16, and the pxxx
41 format is used (i.e., exponent is given in
45 /* This table has been generated by the following program.
46 For 2 <= b <= MPFR_MAX_BASE,
47 RedInvLog2Table[b-2][0] / RedInvLog2Table[b-2][1]
48 is an upper approximation of log(2)/log(b).
50 static const unsigned long RedInvLog2Table[MPFR_MAX_BASE-1][2] = {
116 unsigned long tab[N];
120 int overflow = 0, base_overflow;
127 for (base = 2 ; base < 63 ; base ++)
129 mpfr_set_ui (x, base, GMP_RNDN);
130 mpfr_log2 (x, x, GMP_RNDN);
131 mpfr_ui_div (x, 1, x, GMP_RNDN);
132 printf ("Base: %d x=%e ", base, mpfr_get_d1 (x));
133 for (i = 0 ; i < N ; i++)
136 tab[i] = mpfr_get_ui (y, GMP_RNDN);
137 mpfr_sub (x, x, y, GMP_RNDN);
138 mpfr_ui_div (x, 1, x, GMP_RNDN);
140 for (i = N-1 ; i >= 0 ; i--)
143 mpq_set_ui (q1, tab[i], 1);
144 for (i = i-1 ; i >= 0 ; i--)
147 mpq_set_ui (q2, tab[i], 1);
148 mpq_add (q1, q1, q2);
150 printf("Approx: ", base);
151 mpq_out_str (stdout, 10, q1);
152 printf (" = %e\n", mpq_get_d (q1) );
153 fprintf (stderr, "{");
154 mpz_out_str (stderr, 10, mpq_numref (q1));
155 fprintf (stderr, "UL, ");
156 mpz_out_str (stderr, 10, mpq_denref (q1));
157 fprintf (stderr, "UL},\n");
158 if (mpz_cmp_ui (mpq_numref (q1), 1<<16-1) >= 0
159 || mpz_cmp_ui (mpq_denref (q1), 1<<16-1) >= 0)
160 overflow = 1, base_overflow = base;
168 printf ("OVERFLOW for base =%d!\n", base_overflow);
173 /* Compatible with any locale, but one still assumes that 'a', 'b', 'c',
174 ..., 'z', and 'A', 'B', 'C', ..., 'Z' are consecutive values (like
175 in any ASCII-based character set). */
177 digit_value_in_base (int c, int base)
181 MPFR_ASSERTD (base > 0 && base <= MPFR_MAX_BASE);
183 if (c >= '0' && c <= '9')
185 else if (c >= 'a' && c <= 'z')
186 digit = (base >= 37) ? c - 'a' + 36 : c - 'a' + 10;
187 else if (c >= 'A' && c <= 'Z')
188 digit = c - 'A' + 10;
192 return MPFR_LIKELY (digit < base) ? digit : -1;
195 /* Compatible with any locale, but one still assumes that 'a', 'b', 'c',
196 ..., 'z', and 'A', 'B', 'C', ..., 'Z' are consecutive values (like
197 in any ASCII-based character set). */
198 /* TODO: support EBCDIC. */
200 fast_casecmp (const char *s1, const char *s2)
202 unsigned char c1, c2;
206 c2 = *(const unsigned char *) s2++;
209 c1 = *(const unsigned char *) s1++;
210 if (c1 >= 'A' && c1 <= 'Z')
217 /* Parse a string and fill pstr.
218 Return the advanced ptr too.
220 -1 if invalid string,
221 0 if special string (like nan),
222 1 if the string is ok.
224 So it doesn't return the ternary value
225 BUT if it returns 0 (NAN or INF), the ternary value is also '0'
226 (ie NAN and INF are exact) */
228 parse_string (mpfr_t x, struct parsed_string *pstr,
229 const char **string, int base)
231 const char *str = *string;
234 int res = -1; /* Invalid input return value */
235 const char *prefix_str;
238 decimal_point = (unsigned char) MPFR_DECIMAL_POINT;
241 pstr->mantissa = NULL;
243 /* Optional leading whitespace */
244 while (isspace((unsigned char) *str)) str++;
246 /* An optional sign `+' or `-' */
247 pstr->negative = (*str == '-');
248 if (*str == '-' || *str == '+')
251 /* Can be case-insensitive NAN */
252 if (fast_casecmp (str, "@nan@") == 0)
257 if (base <= 16 && fast_casecmp (str, "nan") == 0)
261 /* Check for "(dummychars)" */
265 for (s = str+1 ; *s != ')' ; s++)
266 if (!(*s >= 'A' && *s <= 'Z')
267 && !(*s >= 'a' && *s <= 'z')
268 && !(*s >= '0' && *s <= '9')
276 /* MPFR_RET_NAN not used as the return value isn't a ternary value */
277 __gmpfr_flags |= MPFR_FLAGS_NAN;
281 /* Can be case-insensitive INF */
282 if (fast_casecmp (str, "@inf@") == 0)
287 if (base <= 16 && fast_casecmp (str, "infinity") == 0)
292 if (base <= 16 && fast_casecmp (str, "inf") == 0)
298 (pstr->negative) ? MPFR_SET_NEG (x) : MPFR_SET_POS (x);
302 /* If base=0 or 16, it may include '0x' prefix */
304 if ((base == 0 || base == 16) && str[0]=='0'
305 && (str[1]=='x' || str[1] == 'X'))
311 /* If base=0 or 2, it may include '0b' prefix */
312 if ((base == 0 || base == 2) && str[0]=='0'
313 && (str[1]=='b' || str[1] == 'B'))
319 /* Else if base=0, we assume decimal base */
325 pstr->alloc = (size_t) strlen (str) * sizeof(char) + 1;
326 pstr->mantissa = (unsigned char*) (*__gmp_allocate_func) (pstr->alloc);
328 /* Read mantissa digits */
330 mant = pstr->mantissa;
335 for (;;) /* Loop until an invalid character is read */
337 int c = (unsigned char) *str++;
338 /* The cast to unsigned char is needed because of digit_value_in_base;
339 decimal_point uses this convention too. */
340 if (c == '.' || c == decimal_point)
342 if (MPFR_UNLIKELY(point)) /* Second '.': stop parsing */
347 c = digit_value_in_base (c, base);
350 MPFR_ASSERTN (c >= 0); /* c is representable in an unsigned char */
351 *mant++ = (unsigned char) c;
355 str--; /* The last read character was invalid */
357 /* Update the # of char in the mantissa */
358 pstr->prec = mant - pstr->mantissa;
359 /* Check if there are no characters in the mantissa (Invalid argument) */
362 /* Check if there was a prefix (in such a case, we have to read
363 again the mantissa without skipping the prefix)
364 The allocated mantissa is still big enough since we will
365 read only 0, and we alloc one more char than needed.
366 FIXME: Not really friendly. Maybe cleaner code? */
367 if (prefix_str != NULL)
378 MPFR_ASSERTD (pstr->exp_base >= 0);
380 /* an optional exponent (e or E, p or P, @) */
381 if ( (*str == '@' || (base <= 10 && (*str == 'e' || *str == 'E')))
382 && (!isspace((unsigned char) str[1])) )
385 /* the exponent digits are kept in ASCII */
386 mp_exp_t read_exp = strtol (str + 1, endptr, 10);
388 if (endptr[0] != str+1)
390 MPFR_ASSERTN (read_exp == (long) read_exp);
391 MPFR_SADD_OVERFLOW (sum, read_exp, pstr->exp_base,
392 mp_exp_t, mp_exp_unsigned_t,
393 MPFR_EXP_MIN, MPFR_EXP_MAX,
395 /* Since exp_base was positive, read_exp + exp_base can't
396 do a negative overflow. */
397 MPFR_ASSERTD (res != 3);
398 pstr->exp_base = sum;
400 else if ((base == 2 || base == 16)
401 && (*str == 'p' || *str == 'P')
402 && (!isspace((unsigned char) str[1])))
405 pstr->exp_bin = (mp_exp_t) strtol (str + 1, endptr, 10);
406 if (endptr[0] != str+1)
410 /* Remove 0's at the beginning and end of mant_s[0..prec_s-1] */
411 mant = pstr->mantissa;
412 for ( ; (pstr->prec > 0) && (*mant == 0) ; mant++, pstr->prec--)
414 for ( ; (pstr->prec > 0) && (mant[pstr->prec - 1] == 0); pstr->prec--);
430 if (pstr->mantissa != NULL && res != 1)
431 (*__gmp_free_func) (pstr->mantissa, pstr->alloc);
435 /* Transform a parsed string to a mpfr_t according to the rounding mode
436 and the precision of x.
437 Returns the ternary value. */
439 parsed_string_to_mpfr (mpfr_t x, struct parsed_string *pstr, mp_rnd_t rnd)
444 mp_limb_t *y, *result;
447 mp_size_t ysize, real_ysize;
449 MPFR_ZIV_DECL (loop);
450 MPFR_TMP_DECL (marker);
452 /* initialize the working precision */
453 prec = MPFR_PREC (x) + MPFR_INT_CEIL_LOG2 (MPFR_PREC (x));
455 /* compute y as long as rounding is not possible */
456 MPFR_TMP_MARK(marker);
457 MPFR_ZIV_INIT (loop, prec);
460 /* Set y to the value of the ~prec most significant bits of pstr->mant
461 (as long as we guarantee correct rounding, we don't need to get
462 exactly prec bits). */
463 ysize = (prec - 1) / BITS_PER_MP_LIMB + 1;
464 /* prec bits corresponds to ysize limbs */
465 ysize_bits = ysize * BITS_PER_MP_LIMB;
466 /* and to ysize_bits >= prec > MPFR_PREC (x) bits */
467 y = (mp_limb_t*) MPFR_TMP_ALLOC ((2 * ysize + 1) * sizeof (mp_limb_t));
468 y += ysize; /* y has (ysize+1) allocated limbs */
470 /* pstr_size is the number of characters we read in pstr->mant
471 to have at least ysize full limbs.
472 We must have base^(pstr_size-1) >= (2^(BITS_PER_MP_LIMB))^ysize
473 (in the worst case, the first digit is one and all others are zero).
474 i.e., pstr_size >= 1 + ysize*BITS_PER_MP_LIMB/log2(base)
475 Since ysize ~ prec/BITS_PER_MP_LIMB and prec < Umax/2 =>
476 ysize*BITS_PER_MP_LIMB can not overflow.
477 We compute pstr_size = 1 + ceil(ysize_bits * Num / Den)
478 where Num/Den >= 1/log2(base)
479 It is not exactly ceil(1/log2(base)) but could be one more (base 2)
480 Quite ugly since it tries to avoid overflow:
481 let Num = RedInvLog2Table[pstr->base-2][0]
482 and Den = RedInvLog2Table[pstr->base-2][1],
483 and ysize_bits = a*Den+b,
484 then ysize_bits * Num/Den = a*Num + (b * Num)/Den,
485 thus ceil(ysize_bits * Num/Den) = a*Num + floor(b * Num + Den - 1)/Den
488 unsigned long Num = RedInvLog2Table[pstr->base-2][0];
489 unsigned long Den = RedInvLog2Table[pstr->base-2][1];
490 pstr_size = ((ysize_bits / Den) * Num)
491 + (((ysize_bits % Den) * Num + Den - 1) / Den)
495 /* since pstr_size corresponds to at least ysize_bits full bits,
496 and ysize_bits > prec, the weight of the neglected part of
497 pstr->mant (if any) is < ulp(y) < ulp(x) */
499 /* if the number of wanted characters is more than what we have in
500 pstr->mant, round it down */
501 if (pstr_size >= pstr->prec)
502 pstr_size = pstr->prec;
503 MPFR_ASSERTD (pstr_size == (mp_exp_t) pstr_size);
505 /* convert str into binary: note that pstr->mant is big endian,
506 thus no offset is needed */
507 real_ysize = mpn_set_str (y, pstr->mant, pstr_size, pstr->base);
508 MPFR_ASSERTD (real_ysize <= ysize+1);
510 /* normalize y: warning we can get even get ysize+1 limbs! */
511 MPFR_ASSERTD (y[real_ysize - 1] != 0); /* mpn_set_str guarantees this */
512 count_leading_zeros (count, y[real_ysize - 1]);
513 /* exact means that the number of limbs of the output of mpn_set_str
514 is less or equal to ysize */
515 exact = real_ysize <= ysize;
516 if (exact) /* shift y to the left in that case y should be exact */
518 /* we have enough limbs to store {y, real_ysize} */
519 /* shift {y, num_limb} for count bits to the left */
521 mpn_lshift (y + ysize - real_ysize, y, real_ysize, count);
522 if (real_ysize != ysize)
525 MPN_COPY_DECR (y + ysize - real_ysize, y, real_ysize);
526 MPN_ZERO (y, ysize - real_ysize);
528 /* for each bit shift decrease exponent of y */
529 /* (This should not overflow) */
530 exp = - ((ysize - real_ysize) * BITS_PER_MP_LIMB + count);
532 else /* shift y to the right, by doing this we might lose some
533 bits from the result of mpn_set_str (in addition to the
534 characters neglected from pstr->mant) */
536 /* shift {y, num_limb} for (BITS_PER_MP_LIMB - count) bits
537 to the right. FIXME: can we prove that count cannot be zero here,
538 since mpn_rshift does not accept a shift of BITS_PER_MP_LIMB? */
539 MPFR_ASSERTD (count != 0);
540 exact = mpn_rshift (y, y, real_ysize, BITS_PER_MP_LIMB - count) ==
542 /* for each bit shift increase exponent of y */
543 exp = BITS_PER_MP_LIMB - count;
546 /* compute base^(exp_s-pr) on n limbs */
547 if (IS_POW2 (pstr->base))
549 /* Base: 2, 4, 8, 16, 32 */
553 count_leading_zeros (pow2, (mp_limb_t) pstr->base);
554 pow2 = BITS_PER_MP_LIMB - pow2 - 1; /* base = 2^pow2 */
555 MPFR_ASSERTD (0 < pow2 && pow2 <= 5);
556 /* exp += pow2 * (pstr->exp_base - pstr_size) + pstr->exp_bin
557 with overflow checking
558 and check that we can add/substract 2 to exp without overflow */
559 MPFR_SADD_OVERFLOW (tmp, pstr->exp_base, -(mp_exp_t) pstr_size,
560 mp_exp_t, mp_exp_unsigned_t,
561 MPFR_EXP_MIN, MPFR_EXP_MAX,
562 goto overflow, goto underflow);
563 /* On some FreeBsd/Alpha, LONG_MIN/1 produces an exception
564 so we check for this before doing the division */
565 if (tmp > 0 && pow2 != 1 && MPFR_EXP_MAX/pow2 <= tmp)
567 else if (tmp < 0 && pow2 != 1 && MPFR_EXP_MIN/pow2 >= tmp)
570 MPFR_SADD_OVERFLOW (tmp, tmp, pstr->exp_bin,
571 mp_exp_t, mp_exp_unsigned_t,
572 MPFR_EXP_MIN, MPFR_EXP_MAX,
573 goto overflow, goto underflow);
574 MPFR_SADD_OVERFLOW (exp, exp, tmp,
575 mp_exp_t, mp_exp_unsigned_t,
576 MPFR_EXP_MIN+2, MPFR_EXP_MAX-2,
577 goto overflow, goto underflow);
581 /* case non-power-of-two-base, and pstr->exp_base > pstr_size */
582 else if (pstr->exp_base > (mp_exp_t) pstr_size)
587 result = (mp_limb_t*) MPFR_TMP_ALLOC ((2*ysize+1)*BYTES_PER_MP_LIMB);
589 /* z = base^(exp_base-sptr_size) using space allocated at y-ysize */
591 /* NOTE: exp_base-pstr_size can't overflow since pstr_size > 0 */
592 err = mpfr_mpn_exp (z, &exp_z, pstr->base,
593 pstr->exp_base - pstr_size, ysize);
596 exact = exact && (err == -1);
598 /* If exact is non zero, then z equals exactly the value of the
599 pstr_size most significant digits from pstr->mant, i.e., the
600 only difference can come from the neglected pstr->prec-pstr_size
601 least significant digits of pstr->mant.
602 If exact is zero, then z is rounded toward zero with respect
605 /* multiply(y = 0.mant_s[0]...mant_s[pr-1])_base by base^(exp_s-g) */
606 mpn_mul_n (result, y, z, ysize);
608 /* compute the error on the product */
613 /* compute the exponent of y */
614 /* exp += exp_z + ysize_bits with overflow checking
615 and check that we can add/substract 2 to exp without overflow */
616 MPFR_SADD_OVERFLOW (exp_z, exp_z, ysize_bits,
617 mp_exp_t, mp_exp_unsigned_t,
618 MPFR_EXP_MIN, MPFR_EXP_MAX,
619 goto overflow, goto underflow);
620 MPFR_SADD_OVERFLOW (exp, exp, exp_z,
621 mp_exp_t, mp_exp_unsigned_t,
622 MPFR_EXP_MIN+2, MPFR_EXP_MAX-2,
623 goto overflow, goto underflow);
625 /* normalize result */
626 if (MPFR_LIMB_MSB (result[2 * ysize - 1]) == 0)
628 mp_limb_t *r = result + ysize - 1;
629 mpn_lshift (r, r, ysize + 1, 1);
630 /* Overflow checking not needed */
634 /* if the low ysize limbs of {result, 2*ysize} are all zero,
635 then the result is still "exact" (if it was before) */
636 exact = exact && (mpn_scan1 (result, 0)
637 >= (unsigned long) ysize_bits);
640 /* case exp_base < pstr_size */
641 else if (pstr->exp_base < (mp_exp_t) pstr_size)
646 result = (mp_limb_t*) MPFR_TMP_ALLOC ((3*ysize+1) * BYTES_PER_MP_LIMB);
648 /* set y to y * K^ysize */
649 y = y - ysize; /* we have allocated ysize limbs at y - ysize */
652 /* pstr_size - pstr->exp_base can overflow */
653 MPFR_SADD_OVERFLOW (exp_z, (mp_exp_t) pstr_size, -pstr->exp_base,
654 mp_exp_t, mp_exp_unsigned_t,
655 MPFR_EXP_MIN, MPFR_EXP_MAX,
656 goto underflow, goto overflow);
658 /* (z, exp_z) = base^(exp_base-pstr_size) */
659 z = result + 2*ysize + 1;
660 err = mpfr_mpn_exp (z, &exp_z, pstr->base, exp_z, ysize);
661 exact = exact && (err == -1);
663 goto underflow; /* FIXME: Sure? */
668 /* result will be put into result + n, and remainder into result */
669 mpn_tdiv_qr (result + ysize, result, (mp_size_t) 0, y,
670 2 * ysize, z, ysize);
672 /* exp -= exp_z + ysize_bits with overflow checking
673 and check that we can add/substract 2 to exp without overflow */
674 MPFR_SADD_OVERFLOW (exp_z, exp_z, ysize_bits,
675 mp_exp_t, mp_exp_unsigned_t,
676 MPFR_EXP_MIN, MPFR_EXP_MAX,
677 goto underflow, goto overflow);
678 MPFR_SADD_OVERFLOW (exp, exp, -exp_z,
679 mp_exp_t, mp_exp_unsigned_t,
680 MPFR_EXP_MIN+2, MPFR_EXP_MAX-2,
681 goto overflow, goto underflow);
683 /* if the remainder of the division is zero, then the result is
684 still "exact" if it was before */
685 exact = exact && (mpn_popcount (result, ysize) == 0);
687 /* normalize result */
688 if (result[2 * ysize] == MPFR_LIMB_ONE)
690 mp_limb_t *r = result + ysize;
691 exact = exact && ((*r & MPFR_LIMB_ONE) == 0);
692 mpn_rshift (r, r, ysize + 1, 1);
693 /* Overflow Checking not needed */
698 /* case exp_base = pstr_size: no multiplication or division needed */
701 /* base^(exp_s-pr) = 1 nothing to compute */
706 /* If result is exact, we still have to consider the neglected part
707 of the input string. For a directed rounding, in that case we could
708 still correctly round, since the neglected part is less than
709 one ulp, but that would make the code more complex, and give a
710 speedup for rare cases only. */
711 exact = exact && (pstr_size == pstr->prec);
713 /* at this point, result is an approximation rounded toward zero
714 of the pstr_size most significant digits of pstr->mant, with
715 equality in case exact is non-zero. */
717 /* test if rounding is possible, and if so exit the loop */
718 if (exact || mpfr_can_round_raw (result, ysize,
719 (pstr->negative) ? -1 : 1,
720 ysize_bits - err - 1,
721 GMP_RNDN, rnd, MPFR_PREC(x)))
724 /* update the prec for next loop */
725 MPFR_ZIV_NEXT (loop, prec);
727 MPFR_ZIV_FREE (loop);
730 if (mpfr_round_raw (MPFR_MANT (x), result,
732 pstr->negative, MPFR_PREC(x), rnd, &res ))
734 /* overflow when rounding y */
735 MPFR_MANT (x)[MPFR_LIMB_SIZE (x) - 1] = MPFR_LIMB_HIGHBIT;
736 /* Overflow Checking not needed */
740 if (res == 0) /* fix ternary value */
742 exact = exact && (pstr_size == pstr->prec);
744 res = (pstr->negative) ? 1 : -1;
747 /* Set sign of x before exp since check_range needs a valid sign */
748 (pstr->negative) ? MPFR_SET_NEG (x) : MPFR_SET_POS (x);
750 /* DO NOT USE MPFR_SET_EXP. The exp may be out of range! */
751 MPFR_SADD_OVERFLOW (exp, exp, ysize_bits,
752 mp_exp_t, mp_exp_unsigned_t,
753 MPFR_EXP_MIN, MPFR_EXP_MAX,
754 goto overflow, goto underflow);
756 res = mpfr_check_range (x, res, rnd);
760 /* This is called when there is a huge overflow
761 (Real expo < MPFR_EXP_MIN << __gmpfr_emin */
764 res = mpfr_underflow (x, rnd, (pstr->negative) ? -1 : 1);
768 res = mpfr_overflow (x, rnd, (pstr->negative) ? -1 : 1);
771 MPFR_TMP_FREE (marker);
776 free_parsed_string (struct parsed_string *pstr)
778 (*__gmp_free_func) (pstr->mantissa, pstr->alloc);
782 mpfr_strtofr (mpfr_t x, const char *string, char **end, int base,
786 struct parsed_string pstr;
788 MPFR_ASSERTN (base == 0 || (base >= 2 && base <= 36));
790 /* If an error occured, it must return 0 */
794 /* Though bases up to MPFR_MAX_BASE are supported, we require a lower
795 limit: 36. For such values <= 36, parsing is case-insensitive. */
796 MPFR_ASSERTN (MPFR_MAX_BASE >= 36);
797 res = parse_string (x, &pstr, &string, base);
798 /* If res == 0, then it was exact (NAN or INF),
799 so it is also the ternary value */
800 if (MPFR_UNLIKELY (res == -1)) /* invalid data */
801 res = 0; /* x is set to 0, which is exact, thus ternary value is 0 */
804 res = parsed_string_to_mpfr (x, &pstr, rnd);
805 free_parsed_string (&pstr);
808 res = mpfr_overflow (x, rnd, (pstr.negative) ? -1 : 1);
809 MPFR_ASSERTD (res != 3);
813 /* This is called when there is a huge overflow
814 (Real expo < MPFR_EXP_MIN << __gmpfr_emin */
817 res = mpfr_underflow (x, rnd, (pstr.negative) ? -1 : 1);
822 *end = (char *) string;