1 /* Macro to print floating point numbers in hexadecimal notation. 2 Copyright (C) 2017-2021 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <https://www.gnu.org/licenses/>. */ 18 19 #define PRINT_FPHEX(FLOAT, VAR, IEEE854_UNION, IEEE854_BIAS) \ 20 do { \ 21 /* We have 112 bits of mantissa plus one implicit digit. Since \ 22 112 bits are representable without rest using hexadecimal \ 23 digits we use only the implicit digits for the number before \ 24 the decimal point. */ \ 25 unsigned long long int num0, num1; \ 26 union IEEE854_UNION u; \ 27 u.d = VAR; \ 28 \ 29 assert (sizeof (FLOAT) == 16); \ 30 \ 31 num0 = (((unsigned long long int) u.ieee.mantissa0) << 32 \ 32 | u.ieee.mantissa1); \ 33 num1 = (((unsigned long long int) u.ieee.mantissa2) << 32 \ 34 | u.ieee.mantissa3); \ 35 \ 36 zero_mantissa = (num0|num1) == 0; \ 37 \ 38 if (sizeof (unsigned long int) > 6) \ 39 { \ 40 numstr = _itoa_word (num1, numbuf + sizeof numbuf, 16, \ 41 info->spec == 'A'); \ 42 wnumstr = _itowa_word (num1, \ 43 wnumbuf + sizeof (wnumbuf) / sizeof (wchar_t),\ 44 16, info->spec == 'A'); \ 45 } \ 46 else \ 47 { \ 48 numstr = _itoa (num1, numbuf + sizeof numbuf, 16, \ 49 info->spec == 'A'); \ 50 wnumstr = _itowa (num1, \ 51 wnumbuf + sizeof (wnumbuf) / sizeof (wchar_t), \ 52 16, info->spec == 'A'); \ 53 } \ 54 \ 55 while (numstr > numbuf + (sizeof numbuf - 64 / 4)) \ 56 { \ 57 *--numstr = '0'; \ 58 *--wnumstr = L'0'; \ 59 } \ 60 \ 61 if (sizeof (unsigned long int) > 6) \ 62 { \ 63 numstr = _itoa_word (num0, numstr, 16, info->spec == 'A'); \ 64 wnumstr = _itowa_word (num0, wnumstr, 16, info->spec == 'A'); \ 65 } \ 66 else \ 67 { \ 68 numstr = _itoa (num0, numstr, 16, info->spec == 'A'); \ 69 wnumstr = _itowa (num0, wnumstr, 16, info->spec == 'A'); \ 70 } \ 71 \ 72 /* Fill with zeroes. */ \ 73 while (numstr > numbuf + (sizeof numbuf - 112 / 4)) \ 74 { \ 75 *--numstr = '0'; \ 76 *--wnumstr = L'0'; \ 77 } \ 78 \ 79 leading = u.ieee.exponent == 0 ? '0' : '1'; \ 80 \ 81 exponent = u.ieee.exponent; \ 82 \ 83 if (exponent == 0) \ 84 { \ 85 if (zero_mantissa) \ 86 expnegative = 0; \ 87 else \ 88 { \ 89 /* This is a denormalized number. */ \ 90 expnegative = 1; \ 91 exponent = IEEE854_BIAS - 1; \ 92 } \ 93 } \ 94 else if (exponent >= IEEE854_BIAS) \ 95 { \ 96 expnegative = 0; \ 97 exponent -= IEEE854_BIAS; \ 98 } \ 99 else \ 100 { \ 101 expnegative = 1; \ 102 exponent = -(exponent - IEEE854_BIAS); \ 103 } \ 104 } while (0) 105