Skip to content

C23 <math.h> Functions #1429

Description

@ibmibmibm

P3935R0 "Rebasing <cmath> on C23"
proposes pulling the remaining C23 <math.h> functions into C++, since C++26 is based on C23
but <cmath> is still based on C17. The paper puts decimal floating-point out of its own scope,
but nearly everything it lists is an ISO/IEC 60559 operation that
C23 Annex H already requires for
_Decimal32 / _Decimal64 / _Decimal128. Boost.Decimal should provide all of them regardless
of what C++29 adopts — the paper even notes that iscanonical and canonicalize are "primarily
motivated by ISO/IEC 60559 decimal floating-point representations."

This issue tracks that surface across all six types (decimal32_t, decimal64_t, decimal128_t,
decimal_fast32_t, decimal_fast64_t, decimal_fast128_t), plus the decimal-only functions from
C23 Annex H that P3935R0 does not cover.

Checked items are already provided; a trailing note gives our current spelling where it differs
from C23.

Classification and canonicalization

  • issignaling — provided, documented under "Non-standard Functions"
  • iscanonical — C23 specifies exactly which decimal encodings are canonical, so unlike the
    binary case this has a hard definition (non-canonical declets in DPD, significands above
    the format maximum in BID)
  • issubnormal
  • iszero
  • canonicalize

Comparison

  • iseqsigcompareSignalingEqual; raises FE_INVALID on quiet NaN, unlike operator==
  • totalorder — could alias the existing comparetotal; see open questions
  • totalordermag

NaN payload

  • getpayload — could alias the existing read_payload
  • setpayload
  • setpayloadsig

Trigonometric (pi-scaled)

  • acospi
  • asinpi
  • atanpi
  • atan2pi
  • cospi
  • sinpi
  • tanpi

Exponential and logarithmic

  • exp10
  • exp10m1
  • exp2m1
  • log10p1
  • logp1 — same value as the existing log1p, different C23 spelling
  • log2p1

Power

  • compoundn(1 + x)^n;
  • pownx^n for integral n
  • powre^(y * log(x)), defined only for x >= 0
  • rootnx^(1/n)
  • rsqrt1 / sqrt(x)

Rounding and integer conversion

  • roundeven — nearest integer with halfway cases rounded to even
  • fromfp
  • ufromfp
  • fromfpx
  • ufromfpx

The fromfp family takes a rounding direction from the FP_INT_* macros below and a bit width,
and returns NaN when the value is not representable.

Maximum and minimum

C23 replaced C99's fmax / fmin NaN behaviour with an IEEE 754-2019 conforming set. The library
currently provides only fmax and fmin.

  • fmaximum
  • fminimum
  • fmaximum_num
  • fminimum_num
  • fmaximum_mag
  • fminimum_mag
  • fmaximum_mag_num
  • fminimum_mag_num

Note that for decimal types these are not simply a comparison: when the operands compare equal but
belong to different cohorts, IEEE 754-2019 specifies which member of the cohort is returned.

Narrowing arithmetic

  • fadd
  • fsub
  • fmul
  • fdiv
  • ffma
  • fsqrt

Narrowing arithmetic: compute in the wider format and round once to the narrower result format.
C23 spells the decimal versions d32addd64, d32addd128, d64addd128, and so on. P3935R0
proposes exposing them in C++ as function templates parameterised on the return type
(std::fadd<T>(x, y)) rather than by name suffix; see open questions.

Decimal-specific (C23 Annex H)

These have no binary counterpart and so are absent from P3935R0, but they belong in any complete
C23 decimal implementation.

  • quantize — provided as quantize
  • samequantum — provided as samequantum
  • quantexp — provided as quantexp
  • encodedec / decodedec — provided as to_dpd / from_dpd
  • encodebin / decodebin — provided as to_bid / from_bid
  • quantum — returns the quantum of a finite value as a value of the same type
  • llquantexpquantexp returning long long

Macros

  • FP_INT_UPWARD
  • FP_INT_DOWNWARD
  • FP_INT_TOWARDZERO
  • FP_INT_TONEARESTFROMZERO
  • FP_INT_TONEAREST
  • FP_FAST_* narrowing-arithmetic hints — C23 spells the decimal analogues
    FP_FAST_D32ADDD64, FP_FAST_D32ADDD128, FP_FAST_D64ADDD128, and correspondingly for
    SUB / MUL / DIV / FMA / SQRT

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions