|
Packit |
6c4009 |
/* Macro to print floating point numbers in hexadecimal notation.
|
|
Packit |
6c4009 |
Copyright (C) 2017-2018 Free Software Foundation, Inc.
|
|
Packit |
6c4009 |
This file is part of the GNU C Library.
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
The GNU C Library is free software; you can redistribute it and/or
|
|
Packit |
6c4009 |
modify it under the terms of the GNU Lesser General Public
|
|
Packit |
6c4009 |
License as published by the Free Software Foundation; either
|
|
Packit |
6c4009 |
version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
The GNU C Library is distributed in the hope that it will be useful,
|
|
Packit |
6c4009 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
6c4009 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
6c4009 |
Lesser General Public License for more details.
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
You should have received a copy of the GNU Lesser General Public
|
|
Packit |
6c4009 |
License along with the GNU C Library; if not, see
|
|
Packit |
6c4009 |
<http://www.gnu.org/licenses/>. */
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
#define PRINT_FPHEX(FLOAT, VAR, IEEE854_UNION, IEEE854_BIAS) \
|
|
Packit |
6c4009 |
do { \
|
|
Packit |
6c4009 |
/* We have 112 bits of mantissa plus one implicit digit. Since \
|
|
Packit |
6c4009 |
112 bits are representable without rest using hexadecimal \
|
|
Packit |
6c4009 |
digits we use only the implicit digits for the number before \
|
|
Packit |
6c4009 |
the decimal point. */ \
|
|
Packit |
6c4009 |
unsigned long long int num0, num1; \
|
|
Packit |
6c4009 |
union IEEE854_UNION u; \
|
|
Packit |
6c4009 |
u.d = VAR; \
|
|
Packit |
6c4009 |
\
|
|
Packit |
6c4009 |
assert (sizeof (FLOAT) == 16); \
|
|
Packit |
6c4009 |
\
|
|
Packit |
6c4009 |
num0 = (((unsigned long long int) u.ieee.mantissa0) << 32 \
|
|
Packit |
6c4009 |
| u.ieee.mantissa1); \
|
|
Packit |
6c4009 |
num1 = (((unsigned long long int) u.ieee.mantissa2) << 32 \
|
|
Packit |
6c4009 |
| u.ieee.mantissa3); \
|
|
Packit |
6c4009 |
\
|
|
Packit |
6c4009 |
zero_mantissa = (num0|num1) == 0; \
|
|
Packit |
6c4009 |
\
|
|
Packit |
6c4009 |
if (sizeof (unsigned long int) > 6) \
|
|
Packit |
6c4009 |
{ \
|
|
Packit |
6c4009 |
numstr = _itoa_word (num1, numbuf + sizeof numbuf, 16, \
|
|
Packit |
6c4009 |
info->spec == 'A'); \
|
|
Packit |
6c4009 |
wnumstr = _itowa_word (num1, \
|
|
Packit |
6c4009 |
wnumbuf + sizeof (wnumbuf) / sizeof (wchar_t),\
|
|
Packit |
6c4009 |
16, info->spec == 'A'); \
|
|
Packit |
6c4009 |
} \
|
|
Packit |
6c4009 |
else \
|
|
Packit |
6c4009 |
{ \
|
|
Packit |
6c4009 |
numstr = _itoa (num1, numbuf + sizeof numbuf, 16, \
|
|
Packit |
6c4009 |
info->spec == 'A'); \
|
|
Packit |
6c4009 |
wnumstr = _itowa (num1, \
|
|
Packit |
6c4009 |
wnumbuf + sizeof (wnumbuf) / sizeof (wchar_t), \
|
|
Packit |
6c4009 |
16, info->spec == 'A'); \
|
|
Packit |
6c4009 |
} \
|
|
Packit |
6c4009 |
\
|
|
Packit |
6c4009 |
while (numstr > numbuf + (sizeof numbuf - 64 / 4)) \
|
|
Packit |
6c4009 |
{ \
|
|
Packit |
6c4009 |
*--numstr = '0'; \
|
|
Packit |
6c4009 |
*--wnumstr = L'0'; \
|
|
Packit |
6c4009 |
} \
|
|
Packit |
6c4009 |
\
|
|
Packit |
6c4009 |
if (sizeof (unsigned long int) > 6) \
|
|
Packit |
6c4009 |
{ \
|
|
Packit |
6c4009 |
numstr = _itoa_word (num0, numstr, 16, info->spec == 'A'); \
|
|
Packit |
6c4009 |
wnumstr = _itowa_word (num0, wnumstr, 16, info->spec == 'A'); \
|
|
Packit |
6c4009 |
} \
|
|
Packit |
6c4009 |
else \
|
|
Packit |
6c4009 |
{ \
|
|
Packit |
6c4009 |
numstr = _itoa (num0, numstr, 16, info->spec == 'A'); \
|
|
Packit |
6c4009 |
wnumstr = _itowa (num0, wnumstr, 16, info->spec == 'A'); \
|
|
Packit |
6c4009 |
} \
|
|
Packit |
6c4009 |
\
|
|
Packit |
6c4009 |
/* Fill with zeroes. */ \
|
|
Packit |
6c4009 |
while (numstr > numbuf + (sizeof numbuf - 112 / 4)) \
|
|
Packit |
6c4009 |
{ \
|
|
Packit |
6c4009 |
*--numstr = '0'; \
|
|
Packit |
6c4009 |
*--wnumstr = L'0'; \
|
|
Packit |
6c4009 |
} \
|
|
Packit |
6c4009 |
\
|
|
Packit |
6c4009 |
leading = u.ieee.exponent == 0 ? '0' : '1'; \
|
|
Packit |
6c4009 |
\
|
|
Packit |
6c4009 |
exponent = u.ieee.exponent; \
|
|
Packit |
6c4009 |
\
|
|
Packit |
6c4009 |
if (exponent == 0) \
|
|
Packit |
6c4009 |
{ \
|
|
Packit |
6c4009 |
if (zero_mantissa) \
|
|
Packit |
6c4009 |
expnegative = 0; \
|
|
Packit |
6c4009 |
else \
|
|
Packit |
6c4009 |
{ \
|
|
Packit |
6c4009 |
/* This is a denormalized number. */ \
|
|
Packit |
6c4009 |
expnegative = 1; \
|
|
Packit |
6c4009 |
exponent = IEEE854_BIAS - 1; \
|
|
Packit |
6c4009 |
} \
|
|
Packit |
6c4009 |
} \
|
|
Packit |
6c4009 |
else if (exponent >= IEEE854_BIAS) \
|
|
Packit |
6c4009 |
{ \
|
|
Packit |
6c4009 |
expnegative = 0; \
|
|
Packit |
6c4009 |
exponent -= IEEE854_BIAS; \
|
|
Packit |
6c4009 |
} \
|
|
Packit |
6c4009 |
else \
|
|
Packit |
6c4009 |
{ \
|
|
Packit |
6c4009 |
expnegative = 1; \
|
|
Packit |
6c4009 |
exponent = -(exponent - IEEE854_BIAS); \
|
|
Packit |
6c4009 |
} \
|
|
Packit |
6c4009 |
} while (0)
|