Format-generic executable hyperbolic functions #
sinh, cosh, and tanh are built from exact dyadics, exact rationals, and the configured
exponential kernel, so the same algorithms elaborate for arbitrary binary descriptors.
The small-argument branches evaluate the polynomial stored in Config.sinhCoeffsAsc exactly.
For generated configurations, Config.sinhTerms selects its length from the destination fraction
width using a Taylor-tail target, while binary32 keeps its pinned six-term table.
sinh rounds the polynomial once. cosh integrates it exactly before one final rational rounding.
tanh approximates s / sqrt (1 + s^2), where s is the truncated sinh value, using an integer
square root with tanhGuardBits extra bits. Larger arguments use dyadic approximations from the
exponential polynomial, combined before destination rounding. Bounded alignment preserves the
sign of tiny contributions at rounding midpoints. These algorithms have no proved general
real-error or ULP bound.
The provider entry points inspect the decoded input exponent before requesting approximation data.
For nonzero inputs with leading exponent below -(fracWidth + 2), sinh and tanh return the
input and cosh returns one. Large inputs return the rounded limit of tanh, or the descriptor's
native overflow result for sinh and cosh. These conservative magnitude branches bypass even
caller-supplied approximation coefficients and avoid huge fixed-point conversions for extreme
inputs. The remaining inputs are compared with the destination's rounded encoding of 1/2
to choose between the polynomial and exponential branches. The lower-level polynomial and dyadic
helpers do not apply these magnitude guards.
Round a nonnegative natural number into the destination format.
Instances For
Exact numerator of the truncated odd Taylor series of sinh at a dyadic argument.
For the Taylor data supplied by Config, dividing by config.sinhDenominator gives
x + x^3/3! + ..., truncated to config.sinhCoeffsAsc.length terms. A custom configuration
instead evaluates its supplied odd polynomial.
Instances For
Evaluate the truncated sinh series at a finite input and round once.
Instances For
Evaluate the integral of the configured sinh polynomial, with constant term one.
If the odd coefficients are aᵢ / D, the even coefficients after the constant are
aᵢ / ((2*i+2)*D). Multiplying by (2*n)!, where n is the coefficient count, makes every
coefficient integral without assuming divisibility properties of a caller-supplied configuration.
Keeping this polynomial exact retains the quartic correction at near-one rounding midpoints.
Instances For
Extra bits carried by the integer square root in the small-argument tanh branch.
Instances For
Approximate tanh for small arguments from a truncated sinh series.
The real identity is tanh x = sinh x / sqrt (1 + sinh x ^ 2). Substituting the truncated
series gives an approximation whose magnitude is a / sqrt b, after clearing powers of two
from its numerator and denominator. The implementation computes
q = floor (sqrt (a^2 * 4^k / b)) and rounds (2q + s) * 2^(-k-1) once, where the sticky bit
s is one exactly when the division or the square root discarded a nonzero remainder. The
sticky bit keeps the truncated magnitude on the same side of every rounding midpoint as the
quotient of the truncated series. Without it a value just above a midpoint rounded down. The
choice of k gives the square-root calculation extra working bits controlled by
tanhGuardBits. A real-error or ULP bound for the complete calculation is not proved.
Instances For
Keep the exponential polynomial's dyadic result until its caller finishes the operation.
Instances For
Classify an exponential-derived dyadic before asking the destination rounder to align it.
Instances For
Combine dyadics for one destination rounding without allocating their entire exponent gap.
A sufficiently small addend is replaced by a signed sticky contribution below the destination's
rounding bits. Its sign still resolves a midpoint in the larger operand. Otherwise exact alignment
shifts by at most a significand's bit length plus fmt.fracWidth + 3.
Instances For
Approximate exp x * scale for a finite input, scaling before destination-format rounding.
The range reduction (expReduce) and polynomial are those of expWithProvider for arguments of
magnitude at least one half. Scaling the dyadic before classifying its range retains the upper
finite interval when scale = 1/2.
Instances For
Combine both scaled exponential approximations before the hyperbolic result is rounded.
Instances For
Form (exp (2*x) - 1) / (exp (2*x) + 1) before destination rounding.
Doubling the decoded argument avoids an intermediate overflow. Outside the quotient's transition range, return its rounded limit before aligning with one. The remaining shifts are bounded by the polynomial's bit length and the destination precision.
Instances For
Evaluate the exponential branch used by sinhWithProvider.
The provider passes the destination's rounded encoding of 1/2. Its decoded dyadic value scales
each exponential before their difference is rounded, avoiding an intermediate destination-format
rounding of either exponential.
Instances For
Evaluate hyperbolic sine with a delayed configuration provider.
Tiny inputs return unchanged before configuration generation. A decoded leading exponent above
log2 (abs maxNormalExponent + 2) implies magnitude greater than abs maxNormalExponent + 2,
where the result overflows, so the descriptor's overflow policy applies without evaluating an
exponential. The remaining inputs below the encoded half use the exact truncated series, and
larger inputs combine dyadic exponential approximations scaled by that encoded half before
rounding.
Instances For
Evaluate hyperbolic cosine with a delayed configuration provider.
Tiny inputs return one and sufficiently large inputs return the descriptor's positive overflow
result before configuration generation, using the same input bounds as sinhWithProvider.
The remaining inputs below the encoded half use an exact even polynomial. Larger finite inputs
add dyadic approximations of exp x / 2 and exp (-x) / 2 before rounding.
Instances For
Evaluate hyperbolic tangent with a provider called only after special values and magnitude guards.
Tiny inputs return unchanged. A decoded leading exponent above log2 (fracWidth + 3) implies
|x| > fracWidth + 3, well past the nearest-even transition to signed one. Returning that limit
before fixed-point conversion also avoids allocating an integer proportional to a huge input.
Instances For
Deterministic hyperbolic sine using the configured exponential kernel.
Instances For
Deterministic hyperbolic cosine using the configured exponential kernel.
Instances For
Deterministic hyperbolic tangent.
After the magnitude guards, small inputs substitute a truncated sinh series into
s / sqrt (1 + s^2). Larger finite inputs round the rational quotient formed from the
dyadic approximation to exp (2 * |x|), then clamp it from below to the small-branch value at the
encoded half. The sign is restored after this comparison.
Instances For
Hyperbolic sine using the default configuration for the destination format.
Instances For
Hyperbolic cosine using the default configuration for the destination format.
Instances For
Hyperbolic tangent using the default configuration for the destination format.