mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-22 03:46:53 -05:00
libquadmath sources are mostly based on glibc sources at present, but derived from them by a manual editing / substitution process and with subsequent manual merges. The manual effort involved in merges means they are sometimes incomplete and long-delayed. Since libquadmath was first created, glibc's support for this format has undergone significant changes so that it can also be used in glibc to provide *f128 functions for the _Float128 type from TS 18661-3. This makes it significantly easier to use it for libquadmath in a more automated fashion, since glibc has a float128_private.h header that redefines many identifiers as macros as needed for building *f128 functions. Simply using float128_private.h directly in libquadmath, with unmodified glibc sources except for changing function names in that one header to be *q instead of *f128, would be tricky, given its dependence on lots of other glibc-internal headers (whereas libquadmath supports non-glibc systems), and also given how some libm functions in glibc are built from type-generic templates using a further set of macros rather than from separate function implementations for each type. So instead this patch adds a script update-quadmath.py to convert glibc sources into libquadmath ones, and the script reads float128_private.h to identify many of the substitutions it should make. quadmath-imp.h is updated with various new internal definitions, taken from glibc as needed; this is the main place expected to need updating manually when subsequent merges from glibc are done using the script. No attempt is made to make the script output match the details of existing formatting, although the differences are of a size that makes a rough comparison (ignoring whitespace) possible. Two new public interfaces are added to libquadmath, exp2q and issignalingq, at a new QUADMATH_1.2 symbol version, since those interfaces are used internally by some of the glibc sources being merged into libquadmath; although there is a new symbol version, no change however is made to the libtool version in the libtool-version file. Although there are various other interfaces now in glibc libm but not in libquadmath, this patch does nothing to add such interfaces (although adding many of them would in fact be easy to do, given the script). One internal file (not providing any public interfaces), math/isinf_nsq.c, is removed, as no longer used by anything in libquadmath after the merge. Conditionals in individual source files on <fenv.h> availability or features are moved into quadmath-imp.h (providing trivial macro versions of the functions if real implementations aren't available), to simplify the substitutions in individual source files. Note however that I haven't tested for any configurations lacking <fenv.h>, so further changes could well be needed there. Two files in libquadmath/math/ are based on glibc sources but not updated in this patch: fmaq.c and rem_pio2q.c. Both could be updated after further changes to the script (and quadmath-imp.h as needed); in the case of rem_pio2q.c, based on two separate glibc source files, those separate files would naturally be split out into separate libquadmath source files in the process (as done in this patch with expq_table.h and tanq_kernel.c, where previously two glibc source files had been merged into one libquadmath source file). complex.c, nanq.c and sqrtq.c are not based on glibc sources (though four of the (trivial) functions in complex.c could readily be replaced by instead using the four corresponding files from glibc, if desired). libquadmath also has printf/ and strtod/ sources based on glibc, also mostly not updated for a long time. Again the script could no doubt be made to generate those automatically, although that would be a larger change (effectively some completely separate logic in the script, not sharing much if anything with the existing code). Bootstrapped with no regressions on x86_64-pc-linux-gnu. PR libquadmath/68686 * Makefile.am: (libquadmath_la_SOURCES): Remove math/isinf_nsq.c. Add math/exp2q.c math/issignalingq.c math/lgammaq_neg.c math/lgammaq_product.c math/tanq_kernel.c math/tgammaq_product.c math/casinhq_kernel.c. * Makefile.in: Regenerate. * libquadmath.texi (exp2q, issignalingq): Document. * quadmath-imp.h: Include <errno.h>, <limits.h>, <stdbool.h> and <fenv.h>. (HIGH_ORDER_BIT_IS_SET_FOR_SNAN, FIX_FLT128_LONG_CONVERT_OVERFLOW) (FIX_FLT128_LLONG_CONVERT_OVERFLOW, __quadmath_kernel_tanq) (__quadmath_gamma_productq, __quadmath_gammaq_r) (__quadmath_lgamma_negq, __quadmath_lgamma_productq) (__quadmath_lgammaq_r, __quadmath_kernel_casinhq, mul_splitq) (math_check_force_underflow_complex, __glibc_likely) (__glibc_unlikely, struct rm_ctx, SET_RESTORE_ROUNDF128) (libc_feholdsetround_ctx, libc_feresetround_ctx): New. (feraiseexcept, fenv_t, feholdexcept, fesetround, feupdateenv) (fesetenv, fetestexcept, feclearexcept): Define if not supported through <fenv.h>. (__quadmath_isinf_nsq): Remove. * quadmath.h (exp2q, issignalingq): New. * quadmath.map (QUADMATH_1.2): New. * quadmath_weak.h (exp2q, issignalingq): New. * update-quadmath.py: New file. * math/isinf_nsq.c: Remove file. * math/casinhq_kernel.c, math/exp2q.c, math/expq_table.h, math/issignalingq.c, math/lgammaq_neg.c, math/lgammaq_product.c, math/tanq_kernel.c, math/tgammaq_product.c: New files. Generated from glibc sources with update-quadmath.py. * math/acoshq.c, math/acosq.c, math/asinhq.c, math/asinq.c, math/atan2q.c, math/atanhq.c, math/atanq.c, math/cacoshq.c, math/cacosq.c, math/casinhq.c, math/casinq.c, math/catanhq.c, math/catanq.c, math/cbrtq.c, math/ccoshq.c, math/ceilq.c, math/cexpq.c, math/cimagq.c, math/clog10q.c, math/clogq.c, math/conjq.c, math/copysignq.c, math/coshq.c, math/cosq.c, math/cosq_kernel.c, math/cprojq.c, math/crealq.c, math/csinhq.c, math/csinq.c, math/csqrtq.c, math/ctanhq.c, math/ctanq.c, math/erfq.c, math/expm1q.c, math/expq.c, math/fabsq.c, math/fdimq.c, math/finiteq.c, math/floorq.c, math/fmaxq.c, math/fminq.c, math/fmodq.c, math/frexpq.c, math/hypotq.c, math/ilogbq.c, math/isinfq.c, math/isnanq.c, math/j0q.c, math/j1q.c, math/jnq.c, math/ldexpq.c, math/lgammaq.c, math/llrintq.c, math/llroundq.c, math/log10q.c, math/log1pq.c, math/log2q.c, math/logbq.c, math/logq.c, math/lrintq.c, math/lroundq.c, math/modfq.c, math/nearbyintq.c, math/nextafterq.c, math/powq.c, math/remainderq.c, math/remquoq.c, math/rintq.c, math/roundq.c, math/scalblnq.c, math/scalbnq.c, math/signbitq.c, math/sincos_table.c, math/sincosq.c, math/sincosq_kernel.c, math/sinhq.c, math/sinq.c, math/sinq_kernel.c, math/tanhq.c, math/tanq.c, math/tgammaq.c, math/truncq.c, math/x2y2m1q.c: Regenerate from glibc sources with update-quadmath.py. From-SVN: r265822
393 lines
13 KiB
Plaintext
393 lines
13 KiB
Plaintext
\input texinfo @c -*-texinfo-*-
|
|
|
|
@c %**start of header
|
|
@setfilename libquadmath.info
|
|
@settitle GCC libquadmath
|
|
@c %**end of header
|
|
|
|
@copying
|
|
Copyright @copyright{} 2010-2018 Free Software Foundation, Inc.
|
|
|
|
@quotation
|
|
Permission is granted to copy, distribute and/or modify this document
|
|
under the terms of the GNU Free Documentation License, Version 1.2 or
|
|
any later version published by the Free Software Foundation; with no
|
|
Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,''
|
|
and with the Back-Cover Texts as in (a) below. A copy of the
|
|
license is included in the section entitled ``GNU Free Documentation
|
|
License.''
|
|
|
|
(a) The FSF's Back-Cover Text is: ``You have the freedom to
|
|
copy and modify this GNU manual.
|
|
@end quotation
|
|
@end copying
|
|
|
|
@ifinfo
|
|
@dircategory GNU Libraries
|
|
@direntry
|
|
* libquadmath: (libquadmath). GCC Quad-Precision Math Library
|
|
@end direntry
|
|
|
|
This manual documents the GCC Quad-Precision Math Library API.
|
|
|
|
Published by the Free Software Foundation
|
|
51 Franklin Street, Fifth Floor
|
|
Boston, MA 02110-1301 USA
|
|
|
|
@insertcopying
|
|
@end ifinfo
|
|
|
|
|
|
@setchapternewpage odd
|
|
|
|
@titlepage
|
|
@title The GCC Quad-Precision Math Library
|
|
@page
|
|
@vskip 0pt plus 1filll
|
|
@comment For the @value{version-GCC} Version*
|
|
@sp 1
|
|
Published by the Free Software Foundation @*
|
|
51 Franklin Street, Fifth Floor@*
|
|
Boston, MA 02110-1301, USA@*
|
|
@sp 1
|
|
@insertcopying
|
|
@end titlepage
|
|
|
|
@summarycontents
|
|
@contents
|
|
@page
|
|
|
|
|
|
@node Top
|
|
@top Introduction
|
|
@cindex Introduction
|
|
|
|
This manual documents the usage of libquadmath, the GCC Quad-Precision
|
|
Math Library Application Programming Interface (API).
|
|
|
|
|
|
@comment
|
|
@comment When you add a new menu item, please keep the right hand
|
|
@comment aligned to the same column. Do not use tabs. This provides
|
|
@comment better formatting.
|
|
@comment
|
|
@menu
|
|
* Typedef and constants:: Defined data types and constants
|
|
* Math Library Routines:: The Libquadmath math runtime application
|
|
programming interface.
|
|
* I/O Library Routines:: The Libquadmath I/O runtime application
|
|
programming interface.
|
|
* GNU Free Documentation License::
|
|
How you can copy and share this manual.
|
|
* Reporting Bugs:: How to report bugs in GCC Libquadmath.
|
|
@c * Index:: Index of this documentation.
|
|
@end menu
|
|
|
|
|
|
@c ---------------------------------------------------------------------
|
|
@c Defined macros
|
|
@c ---------------------------------------------------------------------
|
|
|
|
@node Typedef and constants
|
|
@chapter Typedef and constants
|
|
|
|
The following data type has been defined via @code{typedef}.
|
|
|
|
@table @asis
|
|
@item @code{__complex128}: @code{__float128}-based complex number
|
|
@end table
|
|
|
|
The following macros are defined, which give the numeric limits of the
|
|
@code{__float128} data type.
|
|
|
|
@table @asis
|
|
@item @code{FLT128_MAX}: largest finite number
|
|
@item @code{FLT128_MIN}: smallest positive number with full precision
|
|
@item @code{FLT128_EPSILON}: difference between 1 and the next larger
|
|
representable number
|
|
@item @code{FLT128_DENORM_MIN}: smallest positive denormalized number
|
|
@item @code{FLT128_MANT_DIG}: number of digits in the mantissa (bit precision)
|
|
@item @code{FLT128_MIN_EXP}: maximal negative exponent
|
|
@item @code{FLT128_MAX_EXP}: maximal positive exponent
|
|
@item @code{FLT128_DIG}: number of decimal digits in the mantissa
|
|
@item @code{FLT128_MIN_10_EXP}: maximal negative decimal exponent
|
|
@item @code{FLT128_MAX_10_EXP}: maximal positive decimal exponent
|
|
@end table
|
|
|
|
The following mathematical constants of type @code{__float128} are defined.
|
|
|
|
@table @asis
|
|
@item @code{M_Eq}: the constant e (Euler's number)
|
|
@item @code{M_LOG2Eq}: binary logarithm of 2
|
|
@item @code{M_LOG10Eq}: common, decimal logarithm of 2
|
|
@item @code{M_LN2q}: natural logarithm of 2
|
|
@item @code{M_LN10q}: natural logarithm of 10
|
|
@item @code{M_PIq}: pi
|
|
@item @code{M_PI_2q}: pi divided by two
|
|
@item @code{M_PI_4q}: pi divided by four
|
|
@item @code{M_1_PIq}: one over pi
|
|
@item @code{M_2_PIq}: one over two pi
|
|
@item @code{M_2_SQRTPIq}: two over square root of pi
|
|
@item @code{M_SQRT2q}: square root of 2
|
|
@item @code{M_SQRT1_2q}: one over square root of 2
|
|
@end table
|
|
|
|
|
|
@c ---------------------------------------------------------------------
|
|
@c Math routines
|
|
@c ---------------------------------------------------------------------
|
|
|
|
@node Math Library Routines
|
|
@chapter Math Library Routines
|
|
|
|
The following mathematical functions are available:
|
|
|
|
@table @asis
|
|
@item @code{acosq}: arc cosine function
|
|
@item @code{acoshq}: inverse hyperbolic cosine function
|
|
@item @code{asinq}: arc sine function
|
|
@item @code{asinhq}: inverse hyperbolic sine function
|
|
@item @code{atanq}: arc tangent function
|
|
@item @code{atanhq}: inverse hyperbolic tangent function
|
|
@item @code{atan2q}: arc tangent function
|
|
@item @code{cbrtq}: cube root function
|
|
@item @code{ceilq}: ceiling value function
|
|
@item @code{copysignq}: copy sign of a number
|
|
@item @code{coshq}: hyperbolic cosine function
|
|
@item @code{cosq}: cosine function
|
|
@item @code{erfq}: error function
|
|
@item @code{erfcq}: complementary error function
|
|
@item @code{exp2q}: base 2 exponential function
|
|
@item @code{expq}: exponential function
|
|
@item @code{expm1q}: exponential minus 1 function
|
|
@need 800
|
|
@item @code{fabsq}: absolute value function
|
|
@item @code{fdimq}: positive difference function
|
|
@item @code{finiteq}: check finiteness of value
|
|
@item @code{floorq}: floor value function
|
|
@item @code{fmaq}: fused multiply and add
|
|
@item @code{fmaxq}: determine maximum of two values
|
|
@item @code{fminq}: determine minimum of two values
|
|
@item @code{fmodq}: remainder value function
|
|
@item @code{frexpq}: extract mantissa and exponent
|
|
@item @code{hypotq}: Eucledian distance function
|
|
@item @code{ilogbq}: get exponent of the value
|
|
@item @code{isinfq}: check for infinity
|
|
@item @code{isnanq}: check for not a number
|
|
@item @code{issignalingq}: check for signaling not a number
|
|
@item @code{j0q}: Bessel function of the first kind, first order
|
|
@item @code{j1q}: Bessel function of the first kind, second order
|
|
@item @code{jnq}: Bessel function of the first kind, @var{n}-th order
|
|
@item @code{ldexpq}: load exponent of the value
|
|
@item @code{lgammaq}: logarithmic gamma function
|
|
@item @code{llrintq}: round to nearest integer value
|
|
@item @code{llroundq}: round to nearest integer value away from zero
|
|
@item @code{logbq}: get exponent of the value
|
|
@item @code{logq}: natural logarithm function
|
|
@item @code{log10q}: base 10 logarithm function
|
|
@item @code{log1pq}: compute natural logarithm of the value plus one
|
|
@item @code{log2q}: base 2 logarithm function
|
|
@need 800
|
|
@item @code{lrintq}: round to nearest integer value
|
|
@item @code{lroundq}: round to nearest integer value away from zero
|
|
@item @code{modfq}: decompose the floating-point number
|
|
@item @code{nanq}: return quiet NaN
|
|
@item @code{nearbyintq}: round to nearest integer
|
|
@item @code{nextafterq}: next representable floating-point number
|
|
@item @code{powq}: power function
|
|
@item @code{remainderq}: remainder function
|
|
@item @code{remquoq}: remainder and part of quotient
|
|
@item @code{rintq}: round-to-nearest integral value
|
|
@item @code{roundq}: round-to-nearest integral value, return @code{__float128}
|
|
@item @code{scalblnq}: compute exponent using @code{FLT_RADIX}
|
|
@item @code{scalbnq}: compute exponent using @code{FLT_RADIX}
|
|
@item @code{signbitq}: return sign bit
|
|
@item @code{sincosq}: calculate sine and cosine simultaneously
|
|
@item @code{sinhq}: hyperbolic sine function
|
|
@item @code{sinq}: sine function
|
|
@item @code{sqrtq}: square root function
|
|
@item @code{tanq}: tangent function
|
|
@item @code{tanhq}: hyperbolic tangent function
|
|
@need 800
|
|
@item @code{tgammaq}: true gamma function
|
|
@item @code{truncq}: round to integer, towards zero
|
|
@item @code{y0q}: Bessel function of the second kind, first order
|
|
@item @code{y1q}: Bessel function of the second kind, second order
|
|
@item @code{ynq}: Bessel function of the second kind, @var{n}-th order
|
|
@item @code{cabsq} complex absolute value function
|
|
@item @code{cargq}: calculate the argument
|
|
@item @code{cimagq} imaginary part of complex number
|
|
@item @code{crealq}: real part of complex number
|
|
@item @code{cacoshq}: complex arc hyperbolic cosine function
|
|
@item @code{cacosq}: complex arc cosine function
|
|
@item @code{casinhq}: complex arc hyperbolic sine function
|
|
@item @code{casinq}: complex arc sine function
|
|
@item @code{catanhq}: complex arc hyperbolic tangent function
|
|
@item @code{catanq}: complex arc tangent function
|
|
@item @code{ccosq} complex cosine function:
|
|
@item @code{ccoshq}: complex hyperbolic cosine function
|
|
@item @code{cexpq}: complex exponential function
|
|
@need 800
|
|
@item @code{cexpiq}: computes the exponential function of ``i'' times a
|
|
real value
|
|
@item @code{clogq}: complex natural logarithm
|
|
@item @code{clog10q}: complex base 10 logarithm
|
|
@item @code{conjq}: complex conjugate function
|
|
@item @code{cpowq}: complex power function
|
|
@item @code{cprojq}: project into Riemann Sphere
|
|
@item @code{csinq}: complex sine function
|
|
@item @code{csinhq}: complex hyperbolic sine function
|
|
@item @code{csqrtq}: complex square root
|
|
@item @code{ctanq}: complex tangent function
|
|
@item @code{ctanhq}: complex hyperbolic tangent function
|
|
@end table
|
|
|
|
|
|
@c ---------------------------------------------------------------------
|
|
@c I/O routines
|
|
@c ---------------------------------------------------------------------
|
|
|
|
@node I/O Library Routines
|
|
@chapter I/O Library Routines
|
|
|
|
@menu
|
|
* @code{strtoflt128}: strtoflt128, Convert from string
|
|
* @code{quadmath_snprintf}: quadmath_snprintf, Convert to string
|
|
@end menu
|
|
|
|
|
|
@node strtoflt128
|
|
@section @code{strtoflt128} --- Convert from string
|
|
|
|
The function @code{strtoflt128} converts a string into a
|
|
@code{__float128} number.
|
|
|
|
@table @asis
|
|
@item Syntax
|
|
@code{__float128 strtoflt128 (const char *s, char **sp)}
|
|
|
|
@item @emph{Arguments}:
|
|
@multitable @columnfractions .15 .70
|
|
@item @var{s} @tab input string
|
|
@item @var{sp} @tab the address of the next character in the string
|
|
@end multitable
|
|
|
|
The argument @var{sp} contains, if not @code{NULL}, the address of the
|
|
next character following the parts of the string, which have been read.
|
|
|
|
@item Example
|
|
@smallexample
|
|
#include <quadmath.h>
|
|
|
|
int main ()
|
|
@{
|
|
__float128 r;
|
|
|
|
r = strtoflt128 ("1.2345678", NULL);
|
|
|
|
return 0;
|
|
@}
|
|
@end smallexample
|
|
@end table
|
|
|
|
|
|
@node quadmath_snprintf
|
|
@section @code{quadmath_snprintf} --- Convert to string
|
|
|
|
The function @code{quadmath_snprintf} converts a @code{__float128} floating-point
|
|
number into a string. It is a specialized alternative to @code{snprintf}, where
|
|
the format string is restricted to a single conversion specifier with @code{Q}
|
|
modifier and conversion specifier @code{e}, @code{E}, @code{f}, @code{F}, @code{g},
|
|
@code{G}, @code{a} or @code{A}, with no extra characters before or after the
|
|
conversion specifier. The @code{%m$} or @code{*m$} style must not be used in
|
|
the format.
|
|
|
|
@table @asis
|
|
@item Syntax
|
|
@code{int quadmath_snprintf (char *s, size_t size, const char *format, ...)}
|
|
|
|
@item @emph{Arguments}:
|
|
@multitable @columnfractions .15 .70
|
|
@item @var{s} @tab output string
|
|
@item @var{size} @tab byte size of the string, including tailing NUL
|
|
@item @var{format} @tab conversion specifier string
|
|
@end multitable
|
|
|
|
@item Note
|
|
On some targets when supported by the C library hooks are installed
|
|
for @code{printf} family of functions, so that @code{printf ("%Qe", 1.2Q);}
|
|
etc.@: works too.
|
|
|
|
@item Example
|
|
@smallexample
|
|
#include <quadmath.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
int main ()
|
|
@{
|
|
__float128 r;
|
|
int prec = 20;
|
|
int width = 46;
|
|
char buf[128];
|
|
|
|
r = 2.0q;
|
|
r = sqrtq (r);
|
|
int n = quadmath_snprintf (buf, sizeof buf, "%+-#*.20Qe", width, r);
|
|
if ((size_t) n < sizeof buf)
|
|
printf ("%s\n", buf);
|
|
/* Prints: +1.41421356237309504880e+00 */
|
|
quadmath_snprintf (buf, sizeof buf, "%Qa", r);
|
|
if ((size_t) n < sizeof buf)
|
|
printf ("%s\n", buf);
|
|
/* Prints: 0x1.6a09e667f3bcc908b2fb1366ea96p+0 */
|
|
n = quadmath_snprintf (NULL, 0, "%+-#46.*Qe", prec, r);
|
|
if (n > -1)
|
|
@{
|
|
char *str = malloc (n + 1);
|
|
if (str)
|
|
@{
|
|
quadmath_snprintf (str, n + 1, "%+-#46.*Qe", prec, r);
|
|
printf ("%s\n", str);
|
|
/* Prints: +1.41421356237309504880e+00 */
|
|
@}
|
|
free (str);
|
|
@}
|
|
return 0;
|
|
@}
|
|
@end smallexample
|
|
|
|
@end table
|
|
|
|
|
|
@c ---------------------------------------------------------------------
|
|
@c GNU Free Documentation License
|
|
@c ---------------------------------------------------------------------
|
|
|
|
@include fdl.texi
|
|
|
|
@c ---------------------------------------------------------------------
|
|
@c Reporting Bugs
|
|
@c ---------------------------------------------------------------------
|
|
|
|
@c For BUGURL
|
|
@include libquadmath-vers.texi
|
|
|
|
@node Reporting Bugs
|
|
@chapter Reporting Bugs
|
|
|
|
Bugs in the GCC Quad-Precision Math Library implementation should be
|
|
reported via @value{BUGURL}.
|
|
|
|
|
|
@c ---------------------------------------------------------------------
|
|
@c Index
|
|
@c ---------------------------------------------------------------------
|
|
|
|
@c @node Index
|
|
@c @unnumbered Index
|
|
@c
|
|
@c @printindex cp
|
|
|
|
@bye
|