NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
standards/59336: C23: Annex F and math.h extensions
>Number: 59336
>Category: standards
>Synopsis: C23: Annex F and math.h extensions
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: standards-manager
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sun Apr 20 22:00:00 +0000 2025
>Originator: Taylor R Campbell
>Release: current
>Organization:
The FloatBSD23 Extensions
>Environment:
>Description:
We should consider whether to define __STDC_IEC_559__ or __STDC_IEC_60559_BFP__ (on appropriate architectures -- that is, not vax) to indicate support for IEEE 754 floating-point as in Annex F, which is inexplicably referred to by its little-known IEC number IEC 60559 in the C standard. And similarly for __STDC_IEC_559_COMPLEX__ or __STDC_IEC_60559_COMPLEX__ for Annex G, IEEE 754 complex arithmetic.
It appears gcc defines __GCC_IEC_559=2 and __GCC_IEC_559_COMPLEX=2, but clang does not. Need to do some research to figure out what to do here.
Additionally, if these macros are defined, and the _user_ defines __STDC_WANT_IEC_60559_EXT__, math.h should expose the following additional operations for access to various operations on IEEE 754 values such as total ordering and access to the payloads (see C23, Annex F, F.10.12 and F.10.13):
int totalorder(const double *, const double *);
int totalorderf(const float *, const float *);
int totalorderl(const long double *, const long double *);
int totalordermag(const double *, const double *);
int totalordermagf(const float *, const float *);
int totalordermagl(const long double *, const long double *);
double getpayload(const double *);
float getpayloadf(const float *);
long double getpayloadl(const long double *);
int setpayload(double *, double);
int setpayloadf(float *, float);
int setpayloadl(long double *, long double);
int setpayloadsig(double *, double);
int setpayloadsigf(float *, float);
int setpayloadsigl(long double *, long double);
And, we are also missing from math.h:
double fmaximum(double, double);
float fmaximumf(float, float);
long double fmaximuml(long double, long double);
double fminimum(double, double);
float fminimumf(float, float);
long double fminimuml(long double, long double);
double fmaximum_mag(double, double);
float fmaximum_magf(float, float);
long double fmaximum_magl(long double, long double);
double fminimum_mag(double, double);
float fminimum_magf(float, float);
long double fminimum_magl(long double, long double
double fmaximum_num(double, double);
float fmaximumf_num(float, float);
long double fmaximuml_numl(long double, long double);
double fminimum_num(double, double);
float fminimum_numf(float, float);
long double fminimum_numl(long double, long double);
double fmaximum_mag_num(double, double);
float fmaximum_mag_numf(float, float);
long double fmaximum_mag_numl(long double, long double);
double fminimum_mag_num(double, double);
float fminimum_mag_numf(float, float);
long double fminimum_mag_numl(long double, long double);
And some more round-to-narrower-result functions:
float fadd(double, double);
float faddl(long double, long double);
double daddl(long double, long double);
float fsub(double, double);
float fsubl(long double, long double);
double dsubl(long double, long double);
float fmul(double, double);
float fmull(long double, long double);
double dmull(long double, long double);
float fdiv(double, double);
float fdivl(long double, long double);
double ddivl(long double, long double);
float ffma(double, double, double);
float ffmal(long double, long double, long double);
double dfmal(long double, long double, long double);
float fsqrt(double);
float fsqrtl(long double);
double dsqrtl(long double);
And some explicit-direction, explicit-width rounding functions --
fromfp* to signed, ufromfp* to unsigned, *fromfpx* with the possibility
of raising the inexact exception:
double fromfp(double, int, unsigned);
float fromfpf(float, int, unsigned);
long double fromfpl(long double, int, unsigned);
double ufromfp(double, int, unsigned);
float ufromfpf(float, int, unsigned);
long double ufromfpl(long double, int, unsigned);
...and more: powr, rootn, rsqrt, compoundn, log2p1, logp1 (alias for log1p), log10p1, llogb, exp2m1, exp10m1, exp10, asinpi, acospi, atanpi, atan2pi, issignalling, iscanonical, FP_FAST_* macros, FP_ILOGB0 and FP_ILOGBNAN, roundeven, iseqsig, etc. (XXX Need to go through these systematically to make sure I didn't miss any, which I alm
>How-To-Repeat:
standards inspection
>Fix:
Yes, please!
Home |
Main Index |
Thread Index |
Old Index