1 1.1 mrg /* Floating point output for `printf'. 2 1.1 mrg Copyright (C) 1995-2012 Free Software Foundation, Inc. 3 1.1 mrg 4 1.1 mrg This file is part of the GNU C Library. 5 1.1 mrg Written by Ulrich Drepper <drepper (at) gnu.ai.mit.edu>, 1995. 6 1.1 mrg 7 1.1 mrg The GNU C Library is free software; you can redistribute it and/or 8 1.1 mrg modify it under the terms of the GNU Lesser General Public 9 1.1 mrg License as published by the Free Software Foundation; either 10 1.1 mrg version 2.1 of the License, or (at your option) any later version. 11 1.1 mrg 12 1.1 mrg The GNU C Library is distributed in the hope that it will be useful, 13 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 1.1 mrg Lesser General Public License for more details. 16 1.1 mrg 17 1.1 mrg You should have received a copy of the GNU Lesser General Public 18 1.1 mrg License along with the GNU C Library; if not, see 19 1.1 mrg <http://www.gnu.org/licenses/>. */ 20 1.1 mrg 21 1.1 mrg #include <config.h> 22 1.1 mrg #include <float.h> 23 1.1 mrg #include <limits.h> 24 1.1 mrg #include <math.h> 25 1.1 mrg #include <string.h> 26 1.1 mrg #include <unistd.h> 27 1.1 mrg #include <stdlib.h> 28 1.1 mrg #include <stdbool.h> 29 1.1 mrg #define NDEBUG 30 1.1 mrg #include <assert.h> 31 1.1 mrg #ifdef HAVE_ERRNO_H 32 1.1 mrg #include <errno.h> 33 1.1 mrg #endif 34 1.1 mrg #include <stdio.h> 35 1.1 mrg #include <stdarg.h> 36 1.1 mrg #ifdef HAVE_FENV_H 37 1.1 mrg #include "quadmath-rounding-mode.h" 38 1.1 mrg #endif 39 1.1 mrg #include "quadmath-printf.h" 40 1.1 mrg #include "fpioconst.h" 41 1.1 mrg 42 1.1 mrg #ifdef USE_I18N_NUMBER_H 43 1.1 mrg #include "_i18n_number.h" 44 1.1 mrg #endif 45 1.1 mrg 46 1.1 mrg 47 1.1 mrg /* Macros for doing the actual output. */ 49 1.1 mrg 50 1.1 mrg #define outchar(ch) \ 51 1.1 mrg do \ 52 1.1 mrg { \ 53 1.1 mrg register const int outc = (ch); \ 54 1.1 mrg if (PUTC (outc, fp) == EOF) \ 55 1.1 mrg { \ 56 1.1 mrg if (buffer_malloced) \ 57 1.1 mrg free (wbuffer); \ 58 1.1 mrg return -1; \ 59 1.1 mrg } \ 60 1.1 mrg ++done; \ 61 1.1 mrg } while (0) 62 1.1 mrg 63 1.1 mrg #define PRINT(ptr, wptr, len) \ 64 1.1 mrg do \ 65 1.1 mrg { \ 66 1.1 mrg register size_t outlen = (len); \ 67 1.1 mrg if (len > 20) \ 68 1.1 mrg { \ 69 1.1 mrg if (PUT (fp, wide ? (const char *) wptr : ptr, outlen) != outlen) \ 70 1.1 mrg { \ 71 1.1 mrg if (buffer_malloced) \ 72 1.1 mrg free (wbuffer); \ 73 1.1 mrg return -1; \ 74 1.1 mrg } \ 75 1.1 mrg ptr += outlen; \ 76 1.1 mrg done += outlen; \ 77 1.1 mrg } \ 78 1.1 mrg else \ 79 1.1 mrg { \ 80 1.1 mrg if (wide) \ 81 1.1 mrg while (outlen-- > 0) \ 82 1.1 mrg outchar (*wptr++); \ 83 1.1 mrg else \ 84 1.1 mrg while (outlen-- > 0) \ 85 1.1 mrg outchar (*ptr++); \ 86 1.1 mrg } \ 87 1.1 mrg } while (0) 88 1.1 mrg 89 1.1 mrg #define PADN(ch, len) \ 90 1.1 mrg do \ 91 1.1 mrg { \ 92 1.1 mrg if (PAD (fp, ch, len) != len) \ 93 1.1 mrg { \ 94 1.1 mrg if (buffer_malloced) \ 95 1.1 mrg free (wbuffer); \ 96 1.1 mrg return -1; \ 97 1.1 mrg } \ 98 1.1 mrg done += len; \ 99 1.1 mrg } \ 100 1.1 mrg while (0) 101 1.1 mrg 102 1.1 mrg 103 1.1 mrg /* We use the GNU MP library to handle large numbers. 105 1.1 mrg 106 1.1 mrg An MP variable occupies a varying number of entries in its array. We keep 107 1.1 mrg track of this number for efficiency reasons. Otherwise we would always 108 1.1 mrg have to process the whole array. */ 109 1.1 mrg #define MPN_VAR(name) mp_limb_t *name; mp_size_t name##size 110 1.1 mrg 111 1.1 mrg #define MPN_ASSIGN(dst,src) \ 112 1.1 mrg memcpy (dst, src, (dst##size = src##size) * sizeof (mp_limb_t)) 113 1.1 mrg #define MPN_GE(u,v) \ 114 1.1 mrg (u##size > v##size || (u##size == v##size && mpn_cmp (u, v, u##size) >= 0)) 115 1.1 mrg 116 1.1 mrg extern mp_size_t mpn_extract_flt128 (mp_ptr res_ptr, mp_size_t size, 117 1.1 mrg int *expt, int *is_neg, 118 1.1 mrg __float128 value) attribute_hidden; 119 1.1 mrg static unsigned int guess_grouping (unsigned int intdig_max, 120 1.1 mrg const char *grouping); 121 1.1 mrg 122 1.1 mrg 123 1.1 mrg static wchar_t *group_number (wchar_t *buf, wchar_t *bufend, 124 1.1 mrg unsigned int intdig_no, const char *grouping, 125 1.1 mrg wchar_t thousands_sep, int ngroups); 126 1.1 mrg 127 1.1 mrg 128 1.1 mrg int 129 1.1 mrg __quadmath_printf_fp (struct __quadmath_printf_file *fp, 130 1.1 mrg const struct printf_info *info, 131 1.1 mrg const void *const *args) 132 1.1 mrg { 133 1.1 mrg /* The floating-point value to output. */ 134 1.1 mrg __float128 fpnum; 135 1.1 mrg 136 1.1 mrg /* Locale-dependent representation of decimal point. */ 137 1.1 mrg const char *decimal; 138 1.1 mrg wchar_t decimalwc; 139 1.1 mrg 140 1.1 mrg /* Locale-dependent thousands separator and grouping specification. */ 141 1.1 mrg const char *thousands_sep = NULL; 142 1.1 mrg wchar_t thousands_sepwc = L_('\0'); 143 1.1 mrg const char *grouping; 144 1.1 mrg 145 1.1 mrg /* "NaN" or "Inf" for the special cases. */ 146 1.1 mrg const char *special = NULL; 147 1.1 mrg const wchar_t *wspecial = NULL; 148 1.1 mrg 149 1.1 mrg /* We need just a few limbs for the input before shifting to the right 150 1.1 mrg position. */ 151 1.1 mrg mp_limb_t fp_input[(FLT128_MANT_DIG + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB]; 152 1.1 mrg /* We need to shift the contents of fp_input by this amount of bits. */ 153 1.1 mrg int to_shift = 0; 154 1.1 mrg 155 1.1 mrg /* The fraction of the floting-point value in question */ 156 1.1 mrg MPN_VAR(frac); 157 1.1 mrg /* and the exponent. */ 158 1.1 mrg int exponent; 159 1.1 mrg /* Sign of the exponent. */ 160 1.1 mrg int expsign = 0; 161 1.1 mrg /* Sign of float number. */ 162 1.1 mrg int is_neg = 0; 163 1.1 mrg 164 1.1 mrg /* Scaling factor. */ 165 1.1 mrg MPN_VAR(scale); 166 1.1 mrg 167 1.1 mrg /* Temporary bignum value. */ 168 1.1 mrg MPN_VAR(tmp); 169 1.1 mrg 170 1.1 mrg /* Digit which is result of last hack_digit() call. */ 171 1.1 mrg wchar_t last_digit, next_digit; 172 1.1 mrg bool more_bits; 173 1.1 mrg 174 1.1 mrg /* The type of output format that will be used: 'e'/'E' or 'f'. */ 175 1.1 mrg int type; 176 1.1 mrg 177 1.1 mrg /* Counter for number of written characters. */ 178 1.1 mrg int done = 0; 179 1.1 mrg 180 1.1 mrg /* General helper (carry limb). */ 181 1.1 mrg mp_limb_t cy; 182 1.1 mrg 183 1.1 mrg /* Nonzero if this is output on a wide character stream. */ 184 1.1 mrg int wide = info->wide; 185 1.1 mrg 186 1.1 mrg /* Buffer in which we produce the output. */ 187 1.1 mrg wchar_t *wbuffer = NULL; 188 1.1 mrg /* Flag whether wbuffer is malloc'ed or not. */ 189 1.1 mrg int buffer_malloced = 0; 190 1.1 mrg 191 1.1 mrg auto wchar_t hack_digit (void); 192 1.1 mrg 193 1.1 mrg wchar_t hack_digit (void) 194 1.1 mrg { 195 1.1 mrg mp_limb_t hi; 196 1.1 mrg 197 1.1 mrg if (expsign != 0 && type == 'f' && exponent-- > 0) 198 1.1 mrg hi = 0; 199 1.1 mrg else if (scalesize == 0) 200 1.1 mrg { 201 1.1 mrg hi = frac[fracsize - 1]; 202 1.1 mrg frac[fracsize - 1] = mpn_mul_1 (frac, frac, fracsize - 1, 10); 203 1.1 mrg } 204 1.1 mrg else 205 1.1 mrg { 206 1.1 mrg if (fracsize < scalesize) 207 1.1 mrg hi = 0; 208 1.1 mrg else 209 1.1 mrg { 210 1.1 mrg hi = mpn_divmod (tmp, frac, fracsize, scale, scalesize); 211 1.1 mrg tmp[fracsize - scalesize] = hi; 212 1.1 mrg hi = tmp[0]; 213 1.1 mrg 214 1.1 mrg fracsize = scalesize; 215 1.1 mrg while (fracsize != 0 && frac[fracsize - 1] == 0) 216 1.1 mrg --fracsize; 217 1.1 mrg if (fracsize == 0) 218 1.1 mrg { 219 1.1 mrg /* We're not prepared for an mpn variable with zero 220 1.1 mrg limbs. */ 221 1.1 mrg fracsize = 1; 222 1.1 mrg return L_('0') + hi; 223 1.1 mrg } 224 1.1 mrg } 225 1.1 mrg 226 1.1 mrg mp_limb_t _cy = mpn_mul_1 (frac, frac, fracsize, 10); 227 1.1 mrg if (_cy != 0) 228 1.1 mrg frac[fracsize++] = _cy; 229 1.1 mrg } 230 1.1 mrg 231 1.1 mrg return L_('0') + hi; 232 1.1 mrg } 233 1.1 mrg 234 1.1 mrg /* Figure out the decimal point character. */ 235 1.1 mrg #ifdef USE_NL_LANGINFO 236 1.1 mrg if (info->extra == 0) 237 1.1 mrg decimal = nl_langinfo (DECIMAL_POINT); 238 1.1 mrg else 239 1.1 mrg { 240 1.1 mrg decimal = nl_langinfo (MON_DECIMAL_POINT); 241 1.1 mrg if (*decimal == '\0') 242 1.1 mrg decimal = nl_langinfo (DECIMAL_POINT); 243 1.1 mrg } 244 1.1 mrg /* The decimal point character must never be zero. */ 245 1.1 mrg assert (*decimal != '\0'); 246 1.1 mrg #elif defined USE_LOCALECONV 247 1.1 mrg const struct lconv *lc = localeconv (); 248 1.1 mrg if (info->extra == 0) 249 1.1 mrg decimal = lc->decimal_point; 250 1.1 mrg else 251 1.1 mrg { 252 1.1 mrg decimal = lc->mon_decimal_point; 253 1.1 mrg if (decimal == NULL || *decimal == '\0') 254 1.1 mrg decimal = lc->decimal_point; 255 1.1 mrg } 256 1.1 mrg if (decimal == NULL || *decimal == '\0') 257 1.1 mrg decimal = "."; 258 1.1 mrg #else 259 1.1 mrg decimal = "."; 260 1.1 mrg #endif 261 1.1 mrg #ifdef USE_NL_LANGINFO_WC 262 1.1 mrg if (info->extra == 0) 263 1.1 mrg decimalwc = nl_langinfo_wc (_NL_NUMERIC_DECIMAL_POINT_WC); 264 1.1 mrg else 265 1.1 mrg { 266 1.1 mrg decimalwc = nl_langinfo_wc (_NL_MONETARY_DECIMAL_POINT_WC); 267 1.1 mrg if (decimalwc == L_('\0')) 268 1.1 mrg decimalwc = nl_langinfo_wc (_NL_NUMERIC_DECIMAL_POINT_WC); 269 1.1 mrg } 270 1.1 mrg /* The decimal point character must never be zero. */ 271 1.1 mrg assert (decimalwc != L_('\0')); 272 1.1 mrg #else 273 1.1 mrg decimalwc = L_('.'); 274 1.1 mrg #endif 275 1.1 mrg 276 1.1 mrg #if defined USE_NL_LANGINFO && defined USE_NL_LANGINFO_WC 277 1.1 mrg if (info->group) 278 1.1 mrg { 279 1.1 mrg if (info->extra == 0) 280 1.1 mrg grouping = nl_langinfo (GROUPING); 281 1.1 mrg else 282 1.1 mrg grouping = nl_langinfo (MON_GROUPING); 283 1.1 mrg 284 1.1 mrg if (*grouping <= 0 || *grouping == CHAR_MAX) 285 1.1 mrg grouping = NULL; 286 1.1 mrg else 287 1.1 mrg { 288 1.1 mrg /* Figure out the thousands separator character. */ 289 1.1 mrg if (wide) 290 1.1 mrg { 291 1.1 mrg if (info->extra == 0) 292 1.1 mrg thousands_sepwc = nl_langinfo_wc (_NL_NUMERIC_THOUSANDS_SEP_WC); 293 1.1 mrg else 294 1.1 mrg thousands_sepwc = nl_langinfo_wc (_NL_MONETARY_THOUSANDS_SEP_WC); 295 1.1 mrg 296 1.1 mrg if (thousands_sepwc == L_('\0')) 297 1.1 mrg grouping = NULL; 298 1.1 mrg } 299 1.1 mrg else 300 1.1 mrg { 301 1.1 mrg if (info->extra == 0) 302 1.1 mrg thousands_sep = nl_langinfo (THOUSANDS_SEP); 303 1.1 mrg else 304 1.1 mrg thousands_sep = nl_langinfo (MON_THOUSANDS_SEP); 305 1.1 mrg if (*thousands_sep == '\0') 306 1.1 mrg grouping = NULL; 307 1.1 mrg } 308 1.1 mrg } 309 1.1 mrg } 310 1.1 mrg else 311 1.1 mrg #elif defined USE_NL_LANGINFO 312 1.1 mrg if (info->group && !wide) 313 1.1 mrg { 314 1.1 mrg if (info->extra == 0) 315 1.1 mrg grouping = nl_langinfo (GROUPING); 316 1.1 mrg else 317 1.1 mrg grouping = nl_langinfo (MON_GROUPING); 318 1.1 mrg 319 1.1 mrg if (*grouping <= 0 || *grouping == CHAR_MAX) 320 1.1 mrg grouping = NULL; 321 1.1 mrg else 322 1.1 mrg { 323 1.1 mrg /* Figure out the thousands separator character. */ 324 1.1 mrg if (info->extra == 0) 325 1.1 mrg thousands_sep = nl_langinfo (THOUSANDS_SEP); 326 1.1 mrg else 327 1.1 mrg thousands_sep = nl_langinfo (MON_THOUSANDS_SEP); 328 1.1 mrg 329 1.1 mrg if (*thousands_sep == '\0') 330 1.1 mrg grouping = NULL; 331 1.1 mrg } 332 1.1 mrg } 333 1.1 mrg else 334 1.1 mrg #elif defined USE_LOCALECONV 335 1.1 mrg if (info->group && !wide) 336 1.1 mrg { 337 1.1 mrg if (info->extra == 0) 338 1.1 mrg grouping = lc->grouping; 339 1.1 mrg else 340 1.1 mrg grouping = lc->mon_grouping; 341 1.1 mrg 342 1.1 mrg if (grouping == NULL || *grouping <= 0 || *grouping == CHAR_MAX) 343 1.1 mrg grouping = NULL; 344 1.1 mrg else 345 1.1 mrg { 346 1.1 mrg /* Figure out the thousands separator character. */ 347 1.1 mrg if (info->extra == 0) 348 1.1 mrg thousands_sep = lc->thousands_sep; 349 1.1 mrg else 350 1.1 mrg thousands_sep = lc->mon_thousands_sep; 351 1.1 mrg 352 1.1 mrg if (thousands_sep == NULL || *thousands_sep == '\0') 353 1.1 mrg grouping = NULL; 354 1.1 mrg } 355 1.1 mrg } 356 1.1 mrg else 357 1.1 mrg #endif 358 1.1 mrg grouping = NULL; 359 1.1 mrg if (grouping != NULL && !wide) 360 1.1 mrg /* If we are printing multibyte characters and there is a 361 1.1 mrg multibyte representation for the thousands separator, 362 1.1 mrg we must ensure the wide character thousands separator 363 1.1 mrg is available, even if it is fake. */ 364 1.1 mrg thousands_sepwc = (wchar_t) 0xfffffffe; 365 1.1 mrg 366 1.1.1.2 mrg /* Fetch the argument value. */ 367 1.1 mrg { 368 1.1 mrg memcpy (&fpnum, *(const void *const *) args[0], sizeof (fpnum)); 369 1.1 mrg 370 1.1 mrg /* Check for special values: not a number or infinity. */ 371 1.1 mrg if (isnanq (fpnum)) 372 1.1 mrg { 373 1.1 mrg ieee854_float128 u = { .value = fpnum }; 374 1.1 mrg is_neg = u.ieee.negative != 0; 375 1.1 mrg if (isupper (info->spec)) 376 1.1 mrg { 377 1.1 mrg special = "NAN"; 378 1.1 mrg wspecial = L_("NAN"); 379 1.1 mrg } 380 1.1 mrg else 381 1.1 mrg { 382 1.1 mrg special = "nan"; 383 1.1 mrg wspecial = L_("nan"); 384 1.1 mrg } 385 1.1 mrg } 386 1.1 mrg else if (isinfq (fpnum)) 387 1.1 mrg { 388 1.1 mrg is_neg = fpnum < 0; 389 1.1 mrg if (isupper (info->spec)) 390 1.1 mrg { 391 1.1 mrg special = "INF"; 392 1.1 mrg wspecial = L_("INF"); 393 1.1 mrg } 394 1.1 mrg else 395 1.1 mrg { 396 1.1 mrg special = "inf"; 397 1.1 mrg wspecial = L_("inf"); 398 1.1 mrg } 399 1.1 mrg } 400 1.1 mrg else 401 1.1 mrg { 402 1.1 mrg fracsize = mpn_extract_flt128 (fp_input, 403 1.1 mrg (sizeof (fp_input) / 404 1.1 mrg sizeof (fp_input[0])), 405 1.1 mrg &exponent, &is_neg, fpnum); 406 1.1 mrg to_shift = 1 + fracsize * BITS_PER_MP_LIMB - FLT128_MANT_DIG; 407 1.1 mrg } 408 1.1 mrg } 409 1.1 mrg 410 1.1 mrg if (special) 411 1.1 mrg { 412 1.1 mrg int width = info->width; 413 1.1 mrg 414 1.1 mrg if (is_neg || info->showsign || info->space) 415 1.1 mrg --width; 416 1.1 mrg width -= 3; 417 1.1 mrg 418 1.1 mrg if (!info->left && width > 0) 419 1.1 mrg PADN (' ', width); 420 1.1 mrg 421 1.1 mrg if (is_neg) 422 1.1 mrg outchar ('-'); 423 1.1 mrg else if (info->showsign) 424 1.1 mrg outchar ('+'); 425 1.1 mrg else if (info->space) 426 1.1 mrg outchar (' '); 427 1.1 mrg 428 1.1 mrg PRINT (special, wspecial, 3); 429 1.1 mrg 430 1.1 mrg if (info->left && width > 0) 431 1.1 mrg PADN (' ', width); 432 1.1 mrg 433 1.1 mrg return done; 434 1.1 mrg } 435 1.1 mrg 436 1.1 mrg 437 1.1 mrg /* We need three multiprecision variables. Now that we have the exponent 438 1.1 mrg of the number we can allocate the needed memory. It would be more 439 1.1 mrg efficient to use variables of the fixed maximum size but because this 440 1.1 mrg would be really big it could lead to memory problems. */ 441 1.1 mrg { 442 1.1 mrg mp_size_t bignum_size = ((ABS (exponent) + BITS_PER_MP_LIMB - 1) 443 1.1 mrg / BITS_PER_MP_LIMB 444 1.1 mrg + (FLT128_MANT_DIG / BITS_PER_MP_LIMB > 2 ? 8 : 4)) 445 1.1 mrg * sizeof (mp_limb_t); 446 1.1 mrg frac = (mp_limb_t *) alloca (bignum_size); 447 1.1 mrg tmp = (mp_limb_t *) alloca (bignum_size); 448 1.1 mrg scale = (mp_limb_t *) alloca (bignum_size); 449 1.1 mrg } 450 1.1 mrg 451 1.1 mrg /* We now have to distinguish between numbers with positive and negative 452 1.1 mrg exponents because the method used for the one is not applicable/efficient 453 1.1 mrg for the other. */ 454 1.1 mrg scalesize = 0; 455 1.1 mrg if (exponent > 2) 456 1.1 mrg { 457 1.1 mrg /* |FP| >= 8.0. */ 458 1.1 mrg int scaleexpo = 0; 459 1.1 mrg int explog = FLT128_MAX_10_EXP_LOG; 460 1.1 mrg int exp10 = 0; 461 1.1 mrg const struct mp_power *powers = &_fpioconst_pow10[explog + 1]; 462 1.1 mrg int cnt_h, cnt_l, i; 463 1.1 mrg 464 1.1 mrg if ((exponent + to_shift) % BITS_PER_MP_LIMB == 0) 465 1.1 mrg { 466 1.1 mrg MPN_COPY_DECR (frac + (exponent + to_shift) / BITS_PER_MP_LIMB, 467 1.1 mrg fp_input, fracsize); 468 1.1 mrg fracsize += (exponent + to_shift) / BITS_PER_MP_LIMB; 469 1.1 mrg } 470 1.1 mrg else 471 1.1 mrg { 472 1.1 mrg cy = mpn_lshift (frac + (exponent + to_shift) / BITS_PER_MP_LIMB, 473 1.1 mrg fp_input, fracsize, 474 1.1 mrg (exponent + to_shift) % BITS_PER_MP_LIMB); 475 1.1 mrg fracsize += (exponent + to_shift) / BITS_PER_MP_LIMB; 476 1.1 mrg if (cy) 477 1.1 mrg frac[fracsize++] = cy; 478 1.1 mrg } 479 1.1 mrg MPN_ZERO (frac, (exponent + to_shift) / BITS_PER_MP_LIMB); 480 1.1 mrg 481 1.1 mrg assert (powers > &_fpioconst_pow10[0]); 482 1.1 mrg do 483 1.1 mrg { 484 1.1 mrg --powers; 485 1.1 mrg 486 1.1 mrg /* The number of the product of two binary numbers with n and m 487 1.1 mrg bits respectively has m+n or m+n-1 bits. */ 488 1.1 mrg if (exponent >= scaleexpo + powers->p_expo - 1) 489 1.1 mrg { 490 1.1 mrg if (scalesize == 0) 491 1.1 mrg { 492 1.1 mrg if (FLT128_MANT_DIG > _FPIO_CONST_OFFSET * BITS_PER_MP_LIMB) 493 1.1 mrg { 494 1.1 mrg #define _FPIO_CONST_SHIFT \ 495 1.1 mrg (((FLT128_MANT_DIG + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB) \ 496 1.1 mrg - _FPIO_CONST_OFFSET) 497 1.1 mrg /* 64bit const offset is not enough for 498 1.1 mrg IEEE quad long double. */ 499 1.1 mrg tmpsize = powers->arraysize + _FPIO_CONST_SHIFT; 500 1.1 mrg memcpy (tmp + _FPIO_CONST_SHIFT, 501 1.1 mrg &__tens[powers->arrayoff], 502 1.1 mrg tmpsize * sizeof (mp_limb_t)); 503 1.1 mrg MPN_ZERO (tmp, _FPIO_CONST_SHIFT); 504 1.1 mrg /* Adjust exponent, as scaleexpo will be this much 505 1.1 mrg bigger too. */ 506 1.1 mrg exponent += _FPIO_CONST_SHIFT * BITS_PER_MP_LIMB; 507 1.1 mrg } 508 1.1 mrg else 509 1.1 mrg { 510 1.1 mrg tmpsize = powers->arraysize; 511 1.1 mrg memcpy (tmp, &__tens[powers->arrayoff], 512 1.1 mrg tmpsize * sizeof (mp_limb_t)); 513 1.1 mrg } 514 1.1 mrg } 515 1.1 mrg else 516 1.1 mrg { 517 1.1 mrg cy = mpn_mul (tmp, scale, scalesize, 518 1.1 mrg &__tens[powers->arrayoff 519 1.1 mrg + _FPIO_CONST_OFFSET], 520 1.1 mrg powers->arraysize - _FPIO_CONST_OFFSET); 521 1.1 mrg tmpsize = scalesize + powers->arraysize - _FPIO_CONST_OFFSET; 522 1.1 mrg if (cy == 0) 523 1.1 mrg --tmpsize; 524 1.1 mrg } 525 1.1 mrg 526 1.1 mrg if (MPN_GE (frac, tmp)) 527 1.1 mrg { 528 1.1 mrg int cnt; 529 1.1 mrg MPN_ASSIGN (scale, tmp); 530 1.1 mrg count_leading_zeros (cnt, scale[scalesize - 1]); 531 1.1 mrg scaleexpo = (scalesize - 2) * BITS_PER_MP_LIMB - cnt - 1; 532 1.1 mrg exp10 |= 1 << explog; 533 1.1 mrg } 534 1.1 mrg } 535 1.1 mrg --explog; 536 1.1 mrg } 537 1.1 mrg while (powers > &_fpioconst_pow10[0]); 538 1.1 mrg exponent = exp10; 539 1.1 mrg 540 1.1 mrg /* Optimize number representations. We want to represent the numbers 541 1.1 mrg with the lowest number of bytes possible without losing any 542 1.1 mrg bytes. Also the highest bit in the scaling factor has to be set 543 1.1 mrg (this is a requirement of the MPN division routines). */ 544 1.1 mrg if (scalesize > 0) 545 1.1 mrg { 546 1.1 mrg /* Determine minimum number of zero bits at the end of 547 1.1 mrg both numbers. */ 548 1.1 mrg for (i = 0; scale[i] == 0 && frac[i] == 0; i++) 549 1.1 mrg ; 550 1.1 mrg 551 1.1 mrg /* Determine number of bits the scaling factor is misplaced. */ 552 1.1 mrg count_leading_zeros (cnt_h, scale[scalesize - 1]); 553 1.1 mrg 554 1.1 mrg if (cnt_h == 0) 555 1.1 mrg { 556 1.1 mrg /* The highest bit of the scaling factor is already set. So 557 1.1 mrg we only have to remove the trailing empty limbs. */ 558 1.1 mrg if (i > 0) 559 1.1 mrg { 560 1.1 mrg MPN_COPY_INCR (scale, scale + i, scalesize - i); 561 1.1 mrg scalesize -= i; 562 1.1 mrg MPN_COPY_INCR (frac, frac + i, fracsize - i); 563 1.1 mrg fracsize -= i; 564 1.1 mrg } 565 1.1 mrg } 566 1.1 mrg else 567 1.1 mrg { 568 1.1 mrg if (scale[i] != 0) 569 1.1 mrg { 570 1.1 mrg count_trailing_zeros (cnt_l, scale[i]); 571 1.1 mrg if (frac[i] != 0) 572 1.1 mrg { 573 1.1 mrg int cnt_l2; 574 1.1 mrg count_trailing_zeros (cnt_l2, frac[i]); 575 1.1 mrg if (cnt_l2 < cnt_l) 576 1.1 mrg cnt_l = cnt_l2; 577 1.1 mrg } 578 1.1 mrg } 579 1.1 mrg else 580 1.1 mrg count_trailing_zeros (cnt_l, frac[i]); 581 1.1 mrg 582 1.1 mrg /* Now shift the numbers to their optimal position. */ 583 1.1 mrg if (i == 0 && BITS_PER_MP_LIMB - cnt_h > cnt_l) 584 1.1 mrg { 585 1.1 mrg /* We cannot save any memory. So just roll both numbers 586 1.1 mrg so that the scaling factor has its highest bit set. */ 587 1.1 mrg 588 1.1 mrg (void) mpn_lshift (scale, scale, scalesize, cnt_h); 589 1.1 mrg cy = mpn_lshift (frac, frac, fracsize, cnt_h); 590 1.1 mrg if (cy != 0) 591 1.1 mrg frac[fracsize++] = cy; 592 1.1 mrg } 593 1.1 mrg else if (BITS_PER_MP_LIMB - cnt_h <= cnt_l) 594 1.1 mrg { 595 1.1 mrg /* We can save memory by removing the trailing zero limbs 596 1.1 mrg and by packing the non-zero limbs which gain another 597 1.1 mrg free one. */ 598 1.1 mrg 599 1.1 mrg (void) mpn_rshift (scale, scale + i, scalesize - i, 600 1.1 mrg BITS_PER_MP_LIMB - cnt_h); 601 1.1 mrg scalesize -= i + 1; 602 1.1 mrg (void) mpn_rshift (frac, frac + i, fracsize - i, 603 1.1 mrg BITS_PER_MP_LIMB - cnt_h); 604 1.1 mrg fracsize -= frac[fracsize - i - 1] == 0 ? i + 1 : i; 605 1.1 mrg } 606 1.1 mrg else 607 1.1 mrg { 608 1.1 mrg /* We can only save the memory of the limbs which are zero. 609 1.1 mrg The non-zero parts occupy the same number of limbs. */ 610 1.1 mrg 611 1.1 mrg (void) mpn_rshift (scale, scale + (i - 1), 612 1.1 mrg scalesize - (i - 1), 613 1.1 mrg BITS_PER_MP_LIMB - cnt_h); 614 1.1 mrg scalesize -= i; 615 1.1 mrg (void) mpn_rshift (frac, frac + (i - 1), 616 1.1 mrg fracsize - (i - 1), 617 1.1 mrg BITS_PER_MP_LIMB - cnt_h); 618 1.1 mrg fracsize -= frac[fracsize - (i - 1) - 1] == 0 ? i : i - 1; 619 1.1 mrg } 620 1.1 mrg } 621 1.1 mrg } 622 1.1 mrg } 623 1.1 mrg else if (exponent < 0) 624 1.1 mrg { 625 1.1 mrg /* |FP| < 1.0. */ 626 1.1 mrg int exp10 = 0; 627 1.1 mrg int explog = FLT128_MAX_10_EXP_LOG; 628 1.1 mrg const struct mp_power *powers = &_fpioconst_pow10[explog + 1]; 629 1.1 mrg 630 1.1 mrg /* Now shift the input value to its right place. */ 631 1.1 mrg cy = mpn_lshift (frac, fp_input, fracsize, to_shift); 632 1.1 mrg frac[fracsize++] = cy; 633 1.1 mrg assert (cy == 1 || (frac[fracsize - 2] == 0 && frac[0] == 0)); 634 1.1 mrg 635 1.1 mrg expsign = 1; 636 1.1 mrg exponent = -exponent; 637 1.1 mrg 638 1.1 mrg assert (powers != &_fpioconst_pow10[0]); 639 1.1 mrg do 640 1.1 mrg { 641 1.1 mrg --powers; 642 1.1 mrg 643 1.1 mrg if (exponent >= powers->m_expo) 644 1.1 mrg { 645 1.1 mrg int i, incr, cnt_h, cnt_l; 646 1.1 mrg mp_limb_t topval[2]; 647 1.1 mrg 648 1.1 mrg /* The mpn_mul function expects the first argument to be 649 1.1 mrg bigger than the second. */ 650 1.1 mrg if (fracsize < powers->arraysize - _FPIO_CONST_OFFSET) 651 1.1 mrg cy = mpn_mul (tmp, &__tens[powers->arrayoff 652 1.1 mrg + _FPIO_CONST_OFFSET], 653 1.1 mrg powers->arraysize - _FPIO_CONST_OFFSET, 654 1.1 mrg frac, fracsize); 655 1.1 mrg else 656 1.1 mrg cy = mpn_mul (tmp, frac, fracsize, 657 1.1 mrg &__tens[powers->arrayoff + _FPIO_CONST_OFFSET], 658 1.1 mrg powers->arraysize - _FPIO_CONST_OFFSET); 659 1.1 mrg tmpsize = fracsize + powers->arraysize - _FPIO_CONST_OFFSET; 660 1.1 mrg if (cy == 0) 661 1.1 mrg --tmpsize; 662 1.1 mrg 663 1.1 mrg count_leading_zeros (cnt_h, tmp[tmpsize - 1]); 664 1.1 mrg incr = (tmpsize - fracsize) * BITS_PER_MP_LIMB 665 1.1 mrg + BITS_PER_MP_LIMB - 1 - cnt_h; 666 1.1 mrg 667 1.1 mrg assert (incr <= powers->p_expo); 668 1.1 mrg 669 1.1 mrg /* If we increased the exponent by exactly 3 we have to test 670 1.1 mrg for overflow. This is done by comparing with 10 shifted 671 1.1 mrg to the right position. */ 672 1.1 mrg if (incr == exponent + 3) 673 1.1 mrg { 674 1.1 mrg if (cnt_h <= BITS_PER_MP_LIMB - 4) 675 1.1 mrg { 676 1.1 mrg topval[0] = 0; 677 1.1 mrg topval[1] 678 1.1 mrg = ((mp_limb_t) 10) << (BITS_PER_MP_LIMB - 4 - cnt_h); 679 1.1 mrg } 680 1.1 mrg else 681 1.1 mrg { 682 1.1 mrg topval[0] = ((mp_limb_t) 10) << (BITS_PER_MP_LIMB - 4); 683 1.1 mrg topval[1] = 0; 684 1.1 mrg (void) mpn_lshift (topval, topval, 2, 685 1.1 mrg BITS_PER_MP_LIMB - cnt_h); 686 1.1 mrg } 687 1.1 mrg } 688 1.1 mrg 689 1.1 mrg /* We have to be careful when multiplying the last factor. 690 1.1 mrg If the result is greater than 1.0 be have to test it 691 1.1 mrg against 10.0. If it is greater or equal to 10.0 the 692 1.1 mrg multiplication was not valid. This is because we cannot 693 1.1 mrg determine the number of bits in the result in advance. */ 694 1.1 mrg if (incr < exponent + 3 695 1.1 mrg || (incr == exponent + 3 && 696 1.1 mrg (tmp[tmpsize - 1] < topval[1] 697 1.1 mrg || (tmp[tmpsize - 1] == topval[1] 698 1.1 mrg && tmp[tmpsize - 2] < topval[0])))) 699 1.1 mrg { 700 1.1 mrg /* The factor is right. Adapt binary and decimal 701 1.1 mrg exponents. */ 702 1.1 mrg exponent -= incr; 703 1.1 mrg exp10 |= 1 << explog; 704 1.1 mrg 705 1.1 mrg /* If this factor yields a number greater or equal to 706 1.1 mrg 1.0, we must not shift the non-fractional digits down. */ 707 1.1 mrg if (exponent < 0) 708 1.1 mrg cnt_h += -exponent; 709 1.1 mrg 710 1.1 mrg /* Now we optimize the number representation. */ 711 1.1 mrg for (i = 0; tmp[i] == 0; ++i); 712 1.1 mrg if (cnt_h == BITS_PER_MP_LIMB - 1) 713 1.1 mrg { 714 1.1 mrg MPN_COPY (frac, tmp + i, tmpsize - i); 715 1.1 mrg fracsize = tmpsize - i; 716 1.1 mrg } 717 1.1 mrg else 718 1.1 mrg { 719 1.1 mrg count_trailing_zeros (cnt_l, tmp[i]); 720 1.1 mrg 721 1.1 mrg /* Now shift the numbers to their optimal position. */ 722 1.1 mrg if (i == 0 && BITS_PER_MP_LIMB - 1 - cnt_h > cnt_l) 723 1.1 mrg { 724 1.1 mrg /* We cannot save any memory. Just roll the 725 1.1 mrg number so that the leading digit is in a 726 1.1 mrg separate limb. */ 727 1.1 mrg 728 1.1 mrg cy = mpn_lshift (frac, tmp, tmpsize, cnt_h + 1); 729 1.1 mrg fracsize = tmpsize + 1; 730 1.1 mrg frac[fracsize - 1] = cy; 731 1.1 mrg } 732 1.1 mrg else if (BITS_PER_MP_LIMB - 1 - cnt_h <= cnt_l) 733 1.1 mrg { 734 1.1 mrg (void) mpn_rshift (frac, tmp + i, tmpsize - i, 735 1.1 mrg BITS_PER_MP_LIMB - 1 - cnt_h); 736 1.1 mrg fracsize = tmpsize - i; 737 1.1 mrg } 738 1.1 mrg else 739 1.1 mrg { 740 1.1 mrg /* We can only save the memory of the limbs which 741 1.1 mrg are zero. The non-zero parts occupy the same 742 1.1 mrg number of limbs. */ 743 1.1 mrg 744 1.1 mrg (void) mpn_rshift (frac, tmp + (i - 1), 745 1.1 mrg tmpsize - (i - 1), 746 1.1 mrg BITS_PER_MP_LIMB - 1 - cnt_h); 747 1.1 mrg fracsize = tmpsize - (i - 1); 748 1.1 mrg } 749 1.1 mrg } 750 1.1 mrg } 751 1.1 mrg } 752 1.1 mrg --explog; 753 1.1 mrg } 754 1.1 mrg while (powers != &_fpioconst_pow10[1] && exponent > 0); 755 1.1 mrg /* All factors but 10^-1 are tested now. */ 756 1.1 mrg if (exponent > 0) 757 1.1 mrg { 758 1.1 mrg int cnt_l; 759 1.1 mrg 760 1.1 mrg cy = mpn_mul_1 (tmp, frac, fracsize, 10); 761 1.1 mrg tmpsize = fracsize; 762 1.1 mrg assert (cy == 0 || tmp[tmpsize - 1] < 20); 763 1.1 mrg 764 1.1 mrg count_trailing_zeros (cnt_l, tmp[0]); 765 1.1 mrg if (cnt_l < MIN (4, exponent)) 766 1.1 mrg { 767 1.1 mrg cy = mpn_lshift (frac, tmp, tmpsize, 768 1.1 mrg BITS_PER_MP_LIMB - MIN (4, exponent)); 769 1.1 mrg if (cy != 0) 770 1.1 mrg frac[tmpsize++] = cy; 771 1.1 mrg } 772 1.1 mrg else 773 1.1 mrg (void) mpn_rshift (frac, tmp, tmpsize, MIN (4, exponent)); 774 1.1 mrg fracsize = tmpsize; 775 1.1 mrg exp10 |= 1; 776 1.1 mrg assert (frac[fracsize - 1] < 10); 777 1.1 mrg } 778 1.1 mrg exponent = exp10; 779 1.1 mrg } 780 1.1 mrg else 781 1.1 mrg { 782 1.1 mrg /* This is a special case. We don't need a factor because the 783 1.1 mrg numbers are in the range of 1.0 <= |fp| < 8.0. We simply 784 1.1 mrg shift it to the right place and divide it by 1.0 to get the 785 1.1 mrg leading digit. (Of course this division is not really made.) */ 786 1.1 mrg assert (0 <= exponent && exponent < 3 && 787 1.1 mrg exponent + to_shift < BITS_PER_MP_LIMB); 788 1.1 mrg 789 1.1 mrg /* Now shift the input value to its right place. */ 790 1.1 mrg cy = mpn_lshift (frac, fp_input, fracsize, (exponent + to_shift)); 791 1.1 mrg frac[fracsize++] = cy; 792 1.1 mrg exponent = 0; 793 1.1 mrg } 794 1.1 mrg 795 1.1 mrg { 796 1.1 mrg int width = info->width; 797 1.1 mrg wchar_t *wstartp, *wcp; 798 1.1 mrg size_t chars_needed; 799 1.1 mrg int expscale; 800 1.1 mrg int intdig_max, intdig_no = 0; 801 1.1 mrg int fracdig_min; 802 1.1 mrg int fracdig_max; 803 1.1 mrg int dig_max; 804 1.1 mrg int significant; 805 1.1 mrg int ngroups = 0; 806 1.1 mrg char spec = tolower (info->spec); 807 1.1 mrg 808 1.1 mrg if (spec == 'e') 809 1.1 mrg { 810 1.1 mrg type = info->spec; 811 1.1 mrg intdig_max = 1; 812 1.1 mrg fracdig_min = fracdig_max = info->prec < 0 ? 6 : info->prec; 813 1.1 mrg chars_needed = 1 + 1 + (size_t) fracdig_max + 1 + 1 + 4; 814 1.1 mrg /* d . ddd e +- ddd */ 815 1.1 mrg dig_max = __INT_MAX__; /* Unlimited. */ 816 1.1 mrg significant = 1; /* Does not matter here. */ 817 1.1 mrg } 818 1.1 mrg else if (spec == 'f') 819 1.1 mrg { 820 1.1 mrg type = 'f'; 821 1.1 mrg fracdig_min = fracdig_max = info->prec < 0 ? 6 : info->prec; 822 1.1 mrg dig_max = __INT_MAX__; /* Unlimited. */ 823 1.1 mrg significant = 1; /* Does not matter here. */ 824 1.1 mrg if (expsign == 0) 825 1.1 mrg { 826 1.1 mrg intdig_max = exponent + 1; 827 1.1 mrg /* This can be really big! */ /* XXX Maybe malloc if too big? */ 828 1.1 mrg chars_needed = (size_t) exponent + 1 + 1 + (size_t) fracdig_max; 829 1.1 mrg } 830 1.1 mrg else 831 1.1 mrg { 832 1.1 mrg intdig_max = 1; 833 1.1 mrg chars_needed = 1 + 1 + (size_t) fracdig_max; 834 1.1 mrg } 835 1.1 mrg } 836 1.1 mrg else 837 1.1 mrg { 838 1.1 mrg dig_max = info->prec < 0 ? 6 : (info->prec == 0 ? 1 : info->prec); 839 1.1 mrg if ((expsign == 0 && exponent >= dig_max) 840 1.1 mrg || (expsign != 0 && exponent > 4)) 841 1.1 mrg { 842 1.1 mrg if ('g' - 'G' == 'e' - 'E') 843 1.1 mrg type = 'E' + (info->spec - 'G'); 844 1.1 mrg else 845 1.1 mrg type = isupper (info->spec) ? 'E' : 'e'; 846 1.1 mrg fracdig_max = dig_max - 1; 847 1.1 mrg intdig_max = 1; 848 1.1 mrg chars_needed = 1 + 1 + (size_t) fracdig_max + 1 + 1 + 4; 849 1.1 mrg } 850 1.1 mrg else 851 1.1 mrg { 852 1.1 mrg type = 'f'; 853 1.1 mrg intdig_max = expsign == 0 ? exponent + 1 : 0; 854 1.1 mrg fracdig_max = dig_max - intdig_max; 855 1.1 mrg /* We need space for the significant digits and perhaps 856 1.1 mrg for leading zeros when < 1.0. The number of leading 857 1.1 mrg zeros can be as many as would be required for 858 1.1 mrg exponential notation with a negative two-digit 859 1.1 mrg exponent, which is 4. */ 860 1.1 mrg chars_needed = (size_t) dig_max + 1 + 4; 861 1.1 mrg } 862 1.1 mrg fracdig_min = info->alt ? fracdig_max : 0; 863 1.1 mrg significant = 0; /* We count significant digits. */ 864 1.1 mrg } 865 1.1 mrg 866 1.1 mrg if (grouping) 867 1.1 mrg { 868 1.1 mrg /* Guess the number of groups we will make, and thus how 869 1.1 mrg many spaces we need for separator characters. */ 870 1.1 mrg ngroups = guess_grouping (intdig_max, grouping); 871 1.1 mrg /* Allocate one more character in case rounding increases the 872 1.1 mrg number of groups. */ 873 1.1 mrg chars_needed += ngroups + 1; 874 1.1 mrg } 875 1.1 mrg 876 1.1 mrg /* Allocate buffer for output. We need two more because while rounding 877 1.1 mrg it is possible that we need two more characters in front of all the 878 1.1 mrg other output. If the amount of memory we have to allocate is too 879 1.1 mrg large use `malloc' instead of `alloca'. */ 880 1.1 mrg if (__builtin_expect (chars_needed >= (size_t) -1 / sizeof (wchar_t) - 2 881 1.1 mrg || chars_needed < fracdig_max, 0)) 882 1.1 mrg { 883 1.1 mrg /* Some overflow occurred. */ 884 1.1 mrg #if defined HAVE_ERRNO_H && defined ERANGE 885 1.1 mrg errno = ERANGE; 886 1.1 mrg #endif 887 1.1 mrg return -1; 888 1.1 mrg } 889 1.1 mrg size_t wbuffer_to_alloc = (2 + chars_needed) * sizeof (wchar_t); 890 1.1 mrg buffer_malloced = wbuffer_to_alloc >= 4096; 891 1.1 mrg if (__builtin_expect (buffer_malloced, 0)) 892 1.1 mrg { 893 1.1 mrg wbuffer = (wchar_t *) malloc (wbuffer_to_alloc); 894 1.1 mrg if (wbuffer == NULL) 895 1.1 mrg /* Signal an error to the caller. */ 896 1.1 mrg return -1; 897 1.1 mrg } 898 1.1 mrg else 899 1.1 mrg wbuffer = (wchar_t *) alloca (wbuffer_to_alloc); 900 1.1 mrg wcp = wstartp = wbuffer + 2; /* Let room for rounding. */ 901 1.1 mrg 902 1.1 mrg /* Do the real work: put digits in allocated buffer. */ 903 1.1 mrg if (expsign == 0 || type != 'f') 904 1.1 mrg { 905 1.1 mrg assert (expsign == 0 || intdig_max == 1); 906 1.1 mrg while (intdig_no < intdig_max) 907 1.1 mrg { 908 1.1 mrg ++intdig_no; 909 1.1 mrg *wcp++ = hack_digit (); 910 1.1 mrg } 911 1.1 mrg significant = 1; 912 1.1 mrg if (info->alt 913 1.1 mrg || fracdig_min > 0 914 1.1 mrg || (fracdig_max > 0 && (fracsize > 1 || frac[0] != 0))) 915 1.1 mrg *wcp++ = decimalwc; 916 1.1 mrg } 917 1.1 mrg else 918 1.1 mrg { 919 1.1 mrg /* |fp| < 1.0 and the selected type is 'f', so put "0." 920 1.1 mrg in the buffer. */ 921 1.1 mrg *wcp++ = L_('0'); 922 1.1 mrg --exponent; 923 1.1 mrg *wcp++ = decimalwc; 924 1.1 mrg } 925 1.1 mrg 926 1.1 mrg /* Generate the needed number of fractional digits. */ 927 1.1 mrg int fracdig_no = 0; 928 1.1 mrg int added_zeros = 0; 929 1.1 mrg while (fracdig_no < fracdig_min + added_zeros 930 1.1 mrg || (fracdig_no < fracdig_max && (fracsize > 1 || frac[0] != 0))) 931 1.1 mrg { 932 1.1 mrg ++fracdig_no; 933 1.1 mrg *wcp = hack_digit (); 934 1.1 mrg if (*wcp++ != L_('0')) 935 1.1 mrg significant = 1; 936 1.1 mrg else if (significant == 0) 937 1.1 mrg { 938 1.1 mrg ++fracdig_max; 939 1.1 mrg if (fracdig_min > 0) 940 1.1 mrg ++added_zeros; 941 1.1 mrg } 942 1.1 mrg } 943 1.1 mrg 944 1.1 mrg /* Do rounding. */ 945 1.1 mrg last_digit = wcp[-1] != decimalwc ? wcp[-1] : wcp[-2]; 946 1.1 mrg next_digit =hack_digit (); 947 1.1 mrg 948 1.1 mrg if (next_digit != L_('0') && next_digit != L_('5')) 949 1.1 mrg more_bits = true; 950 1.1 mrg else if (fracsize == 1 && frac[0] == 0) 951 1.1 mrg /* Rest of the number is zero. */ 952 1.1 mrg more_bits = false; 953 1.1 mrg else if (scalesize == 0) 954 1.1 mrg { 955 1.1 mrg /* Here we have to see whether all limbs are zero since no 956 1.1 mrg normalization happened. */ 957 1.1 mrg size_t lcnt = fracsize; 958 1.1 mrg while (lcnt >= 1 && frac[lcnt - 1] == 0) 959 1.1 mrg --lcnt; 960 1.1 mrg more_bits = lcnt > 0; 961 1.1 mrg } 962 1.1 mrg else 963 1.1 mrg more_bits = true; 964 1.1 mrg 965 1.1 mrg #ifdef HAVE_FENV_H 966 1.1 mrg int rounding_mode = get_rounding_mode (); 967 1.1 mrg if (round_away (is_neg, (last_digit - L_('0')) & 1, next_digit >= L_('5'), 968 1.1 mrg more_bits, rounding_mode)) 969 1.1 mrg { 970 1.1 mrg wchar_t *wtp = wcp; 971 1.1 mrg 972 1.1 mrg if (fracdig_no > 0) 973 1.1 mrg { 974 1.1 mrg /* Process fractional digits. Terminate if not rounded or 975 1.1 mrg radix character is reached. */ 976 1.1 mrg int removed = 0; 977 1.1 mrg while (*--wtp != decimalwc && *wtp == L_('9')) 978 1.1 mrg { 979 1.1 mrg *wtp = L_('0'); 980 1.1 mrg ++removed; 981 1.1 mrg } 982 1.1 mrg if (removed == fracdig_min && added_zeros > 0) 983 1.1 mrg --added_zeros; 984 1.1 mrg if (*wtp != decimalwc) 985 1.1 mrg /* Round up. */ 986 1.1 mrg (*wtp)++; 987 1.1 mrg else if (__builtin_expect (spec == 'g' && type == 'f' && info->alt 988 1.1 mrg && wtp == wstartp + 1 989 1.1 mrg && wstartp[0] == L_('0'), 990 1.1 mrg 0)) 991 1.1 mrg /* This is a special case: the rounded number is 1.0, 992 1.1 mrg the format is 'g' or 'G', and the alternative format 993 1.1 mrg is selected. This means the result must be "1.". */ 994 1.1 mrg --added_zeros; 995 1.1 mrg } 996 1.1 mrg 997 1.1 mrg if (fracdig_no == 0 || *wtp == decimalwc) 998 1.1 mrg { 999 1.1 mrg /* Round the integer digits. */ 1000 1.1 mrg if (*(wtp - 1) == decimalwc) 1001 1.1 mrg --wtp; 1002 1.1 mrg 1003 1.1 mrg while (--wtp >= wstartp && *wtp == L_('9')) 1004 1.1 mrg *wtp = L_('0'); 1005 1.1 mrg 1006 1.1 mrg if (wtp >= wstartp) 1007 1.1 mrg /* Round up. */ 1008 1.1 mrg (*wtp)++; 1009 1.1 mrg else 1010 1.1 mrg /* It is more critical. All digits were 9's. */ 1011 1.1 mrg { 1012 1.1 mrg if (type != 'f') 1013 1.1 mrg { 1014 1.1 mrg *wstartp = '1'; 1015 1.1 mrg exponent += expsign == 0 ? 1 : -1; 1016 1.1 mrg 1017 1.1 mrg /* The above exponent adjustment could lead to 1.0e-00, 1018 1.1 mrg e.g. for 0.999999999. Make sure exponent 0 always 1019 1.1 mrg uses + sign. */ 1020 1.1 mrg if (exponent == 0) 1021 1.1 mrg expsign = 0; 1022 1.1 mrg } 1023 1.1 mrg else if (intdig_no == dig_max) 1024 1.1 mrg { 1025 1.1 mrg /* This is the case where for type %g the number fits 1026 1.1 mrg really in the range for %f output but after rounding 1027 1.1 mrg the number of digits is too big. */ 1028 1.1 mrg *--wstartp = decimalwc; 1029 1.1 mrg *--wstartp = L_('1'); 1030 1.1 mrg 1031 1.1 mrg if (info->alt || fracdig_no > 0) 1032 1.1 mrg { 1033 1.1 mrg /* Overwrite the old radix character. */ 1034 1.1 mrg wstartp[intdig_no + 2] = L_('0'); 1035 1.1 mrg ++fracdig_no; 1036 1.1 mrg } 1037 1.1 mrg 1038 1.1 mrg fracdig_no += intdig_no; 1039 1.1 mrg intdig_no = 1; 1040 1.1 mrg fracdig_max = intdig_max - intdig_no; 1041 1.1 mrg ++exponent; 1042 1.1 mrg /* Now we must print the exponent. */ 1043 1.1 mrg type = isupper (info->spec) ? 'E' : 'e'; 1044 1.1 mrg } 1045 1.1 mrg else 1046 1.1 mrg { 1047 1.1 mrg /* We can simply add another another digit before the 1048 1.1 mrg radix. */ 1049 1.1 mrg *--wstartp = L_('1'); 1050 1.1 mrg ++intdig_no; 1051 1.1 mrg } 1052 1.1 mrg 1053 1.1 mrg /* While rounding the number of digits can change. 1054 1.1 mrg If the number now exceeds the limits remove some 1055 1.1 mrg fractional digits. */ 1056 1.1 mrg if (intdig_no + fracdig_no > dig_max) 1057 1.1 mrg { 1058 1.1 mrg wcp -= intdig_no + fracdig_no - dig_max; 1059 1.1 mrg fracdig_no -= intdig_no + fracdig_no - dig_max; 1060 1.1 mrg } 1061 1.1 mrg } 1062 1.1 mrg } 1063 1.1 mrg } 1064 1.1 mrg #endif 1065 1.1 mrg 1066 1.1 mrg /* Now remove unnecessary '0' at the end of the string. */ 1067 1.1 mrg while (fracdig_no > fracdig_min + added_zeros && *(wcp - 1) == L_('0')) 1068 1.1 mrg { 1069 1.1 mrg --wcp; 1070 1.1 mrg --fracdig_no; 1071 1.1 mrg } 1072 1.1 mrg /* If we eliminate all fractional digits we perhaps also can remove 1073 1.1 mrg the radix character. */ 1074 1.1 mrg if (fracdig_no == 0 && !info->alt && *(wcp - 1) == decimalwc) 1075 1.1 mrg --wcp; 1076 1.1 mrg 1077 1.1 mrg if (grouping) 1078 1.1 mrg { 1079 1.1 mrg /* Rounding might have changed the number of groups. We allocated 1080 1.1 mrg enough memory but we need here the correct number of groups. */ 1081 1.1 mrg if (intdig_no != intdig_max) 1082 1.1 mrg ngroups = guess_grouping (intdig_no, grouping); 1083 1.1 mrg 1084 1.1 mrg /* Add in separator characters, overwriting the same buffer. */ 1085 1.1 mrg wcp = group_number (wstartp, wcp, intdig_no, grouping, thousands_sepwc, 1086 1.1 mrg ngroups); 1087 1.1 mrg } 1088 1.1 mrg 1089 1.1 mrg /* Write the exponent if it is needed. */ 1090 1.1 mrg if (type != 'f') 1091 1.1 mrg { 1092 1.1 mrg if (__builtin_expect (expsign != 0 && exponent == 4 && spec == 'g', 0)) 1093 1.1 mrg { 1094 1.1 mrg /* This is another special case. The exponent of the number is 1095 1.1 mrg really smaller than -4, which requires the 'e'/'E' format. 1096 1.1 mrg But after rounding the number has an exponent of -4. */ 1097 1.1 mrg assert (wcp >= wstartp + 1); 1098 1.1 mrg assert (wstartp[0] == L_('1')); 1099 1.1 mrg memcpy (wstartp, L_("0.0001"), 6 * sizeof (wchar_t)); 1100 1.1 mrg wstartp[1] = decimalwc; 1101 1.1 mrg if (wcp >= wstartp + 2) 1102 1.1 mrg { 1103 1.1 mrg size_t cnt; 1104 1.1 mrg for (cnt = 0; cnt < wcp - (wstartp + 2); cnt++) 1105 1.1 mrg wstartp[6 + cnt] = L_('0'); 1106 1.1 mrg wcp += 4; 1107 1.1 mrg } 1108 1.1 mrg else 1109 1.1 mrg wcp += 5; 1110 1.1 mrg } 1111 1.1 mrg else 1112 1.1 mrg { 1113 1.1 mrg *wcp++ = (wchar_t) type; 1114 1.1 mrg *wcp++ = expsign ? L_('-') : L_('+'); 1115 1.1 mrg 1116 1.1 mrg /* Find the magnitude of the exponent. */ 1117 1.1 mrg expscale = 10; 1118 1.1 mrg while (expscale <= exponent) 1119 1.1 mrg expscale *= 10; 1120 1.1 mrg 1121 1.1 mrg if (exponent < 10) 1122 1.1 mrg /* Exponent always has at least two digits. */ 1123 1.1 mrg *wcp++ = L_('0'); 1124 1.1 mrg else 1125 1.1 mrg do 1126 1.1 mrg { 1127 1.1 mrg expscale /= 10; 1128 1.1 mrg *wcp++ = L_('0') + (exponent / expscale); 1129 1.1 mrg exponent %= expscale; 1130 1.1 mrg } 1131 1.1 mrg while (expscale > 10); 1132 1.1 mrg *wcp++ = L_('0') + exponent; 1133 1.1 mrg } 1134 1.1 mrg } 1135 1.1 mrg 1136 1.1 mrg /* Compute number of characters which must be filled with the padding 1137 1.1 mrg character. */ 1138 1.1 mrg if (is_neg || info->showsign || info->space) 1139 1.1 mrg --width; 1140 1.1 mrg width -= wcp - wstartp; 1141 1.1 mrg 1142 1.1 mrg if (!info->left && info->pad != '0' && width > 0) 1143 1.1 mrg PADN (info->pad, width); 1144 1.1 mrg 1145 1.1 mrg if (is_neg) 1146 1.1 mrg outchar ('-'); 1147 1.1 mrg else if (info->showsign) 1148 1.1 mrg outchar ('+'); 1149 1.1 mrg else if (info->space) 1150 1.1 mrg outchar (' '); 1151 1.1 mrg 1152 1.1 mrg if (!info->left && info->pad == '0' && width > 0) 1153 1.1 mrg PADN ('0', width); 1154 1.1 mrg 1155 1.1 mrg { 1156 1.1 mrg char *buffer = NULL; 1157 1.1 mrg char *buffer_end __attribute__((__unused__)) = NULL; 1158 1.1 mrg char *cp = NULL; 1159 1.1 mrg char *tmpptr; 1160 1.1 mrg 1161 1.1 mrg if (! wide) 1162 1.1 mrg { 1163 1.1 mrg /* Create the single byte string. */ 1164 1.1 mrg size_t decimal_len; 1165 1.1 mrg size_t thousands_sep_len; 1166 1.1 mrg wchar_t *copywc; 1167 1.1 mrg #ifdef USE_I18N_NUMBER_H 1168 1.1 mrg size_t factor = (info->i18n 1169 1.1 mrg ? nl_langinfo_wc (_NL_CTYPE_MB_CUR_MAX) 1170 1.1 mrg : 1); 1171 1.1 mrg #else 1172 1.1 mrg size_t factor = 1; 1173 1.1 mrg #endif 1174 1.1 mrg 1175 1.1 mrg decimal_len = strlen (decimal); 1176 1.1 mrg 1177 1.1 mrg if (thousands_sep == NULL) 1178 1.1 mrg thousands_sep_len = 0; 1179 1.1 mrg else 1180 1.1 mrg thousands_sep_len = strlen (thousands_sep); 1181 1.1 mrg 1182 1.1 mrg size_t nbuffer = (2 + chars_needed * factor + decimal_len 1183 1.1 mrg + ngroups * thousands_sep_len); 1184 1.1 mrg if (__builtin_expect (buffer_malloced, 0)) 1185 1.1 mrg { 1186 1.1 mrg buffer = (char *) malloc (nbuffer); 1187 1.1 mrg if (buffer == NULL) 1188 1.1 mrg { 1189 1.1 mrg /* Signal an error to the caller. */ 1190 1.1 mrg free (wbuffer); 1191 1.1 mrg return -1; 1192 1.1 mrg } 1193 1.1 mrg } 1194 1.1 mrg else 1195 1.1 mrg buffer = (char *) alloca (nbuffer); 1196 1.1 mrg buffer_end = buffer + nbuffer; 1197 1.1 mrg 1198 1.1 mrg /* Now copy the wide character string. Since the character 1199 1.1 mrg (except for the decimal point and thousands separator) must 1200 1.1 mrg be coming from the ASCII range we can esily convert the 1201 1.1 mrg string without mapping tables. */ 1202 1.1 mrg for (cp = buffer, copywc = wstartp; copywc < wcp; ++copywc) 1203 1.1 mrg if (*copywc == decimalwc) 1204 1.1 mrg memcpy (cp, decimal, decimal_len), cp += decimal_len; 1205 1.1 mrg else if (*copywc == thousands_sepwc) 1206 1.1 mrg memcpy (cp, thousands_sep, thousands_sep_len), cp += thousands_sep_len; 1207 1.1 mrg else 1208 1.1 mrg *cp++ = (char) *copywc; 1209 1.1 mrg } 1210 1.1 mrg 1211 1.1 mrg tmpptr = buffer; 1212 1.1 mrg #if USE_I18N_NUMBER_H 1213 1.1 mrg if (__builtin_expect (info->i18n, 0)) 1214 1.1 mrg { 1215 1.1 mrg tmpptr = _i18n_number_rewrite (tmpptr, cp, buffer_end); 1216 1.1 mrg cp = buffer_end; 1217 1.1 mrg assert ((uintptr_t) buffer <= (uintptr_t) tmpptr); 1218 1.1 mrg assert ((uintptr_t) tmpptr < (uintptr_t) buffer_end); 1219 1.1 mrg } 1220 1.1 mrg #endif 1221 1.1 mrg 1222 1.1 mrg PRINT (tmpptr, wstartp, wide ? wcp - wstartp : cp - tmpptr); 1223 1.1 mrg 1224 1.1 mrg /* Free the memory if necessary. */ 1225 1.1 mrg if (__builtin_expect (buffer_malloced, 0)) 1226 1.1 mrg { 1227 1.1 mrg free (buffer); 1228 1.1 mrg free (wbuffer); 1229 1.1 mrg } 1230 1.1 mrg } 1231 1.1 mrg 1232 1.1 mrg if (info->left && width > 0) 1233 1.1 mrg PADN (info->pad, width); 1234 1.1 mrg } 1235 1.1 mrg return done; 1236 1.1 mrg } 1237 1.1 mrg 1238 1.1 mrg /* Return the number of extra grouping characters that will be inserted 1240 1.1 mrg into a number with INTDIG_MAX integer digits. */ 1241 1.1 mrg 1242 1.1 mrg static unsigned int 1243 1.1 mrg guess_grouping (unsigned int intdig_max, const char *grouping) 1244 1.1 mrg { 1245 1.1 mrg unsigned int groups; 1246 1.1 mrg 1247 1.1 mrg /* We treat all negative values like CHAR_MAX. */ 1248 1.1 mrg 1249 1.1 mrg if (*grouping == CHAR_MAX || *grouping <= 0) 1250 1.1 mrg /* No grouping should be done. */ 1251 1.1 mrg return 0; 1252 1.1 mrg 1253 1.1 mrg groups = 0; 1254 1.1 mrg while (intdig_max > (unsigned int) *grouping) 1255 1.1 mrg { 1256 1.1 mrg ++groups; 1257 1.1 mrg intdig_max -= *grouping++; 1258 1.1 mrg 1259 1.1 mrg if (*grouping == CHAR_MAX 1260 1.1 mrg #if CHAR_MIN < 0 1261 1.1 mrg || *grouping < 0 1262 1.1 mrg #endif 1263 1.1 mrg ) 1264 1.1 mrg /* No more grouping should be done. */ 1265 1.1 mrg break; 1266 1.1 mrg else if (*grouping == 0) 1267 1.1 mrg { 1268 1.1 mrg /* Same grouping repeats. */ 1269 1.1 mrg groups += (intdig_max - 1) / grouping[-1]; 1270 1.1 mrg break; 1271 1.1 mrg } 1272 1.1 mrg } 1273 1.1 mrg 1274 1.1 mrg return groups; 1275 1.1 mrg } 1276 1.1 mrg 1277 1.1 mrg /* Group the INTDIG_NO integer digits of the number in [BUF,BUFEND). 1278 1.1 mrg There is guaranteed enough space past BUFEND to extend it. 1279 1.1 mrg Return the new end of buffer. */ 1280 1.1 mrg 1281 1.1 mrg static wchar_t * 1282 1.1 mrg group_number (wchar_t *buf, wchar_t *bufend, unsigned int intdig_no, 1283 1.1 mrg const char *grouping, wchar_t thousands_sep, int ngroups) 1284 1.1 mrg { 1285 1.1 mrg wchar_t *p; 1286 1.1 mrg 1287 1.1 mrg if (ngroups == 0) 1288 1.1 mrg return bufend; 1289 1.1 mrg 1290 1.1 mrg /* Move the fractional part down. */ 1291 1.1 mrg memmove (buf + intdig_no + ngroups, buf + intdig_no, 1292 1.1 mrg (bufend - (buf + intdig_no)) * sizeof (wchar_t)); 1293 1.1 mrg 1294 1.1 mrg p = buf + intdig_no + ngroups - 1; 1295 1.1 mrg do 1296 1.1 mrg { 1297 1.1 mrg unsigned int len = *grouping++; 1298 1.1 mrg do 1299 1.1 mrg *p-- = buf[--intdig_no]; 1300 1.1 mrg while (--len > 0); 1301 1.1 mrg *p-- = thousands_sep; 1302 1.1 mrg 1303 1.1 mrg if (*grouping == CHAR_MAX 1304 1.1 mrg #if CHAR_MIN < 0 1305 1.1 mrg || *grouping < 0 1306 1.1 mrg #endif 1307 1.1 mrg ) 1308 1.1 mrg /* No more grouping should be done. */ 1309 1.1 mrg break; 1310 1.1 mrg else if (*grouping == 0) 1311 1.1 mrg /* Same grouping repeats. */ 1312 1.1 mrg --grouping; 1313 1.1 mrg } while (intdig_no > (unsigned int) *grouping); 1314 1.1 mrg 1315 1.1 mrg /* Copy the remaining ungrouped digits. */ 1316 1.1 mrg do 1317 1.1 mrg *p-- = buf[--intdig_no]; 1318 1.1 mrg while (p > buf); 1319 1320 return bufend + ngroups; 1321 } 1322