The titles' scalbn and scalbnf never set errno, at any exponent. On
Windows the host scalbn already matches, but glibc's scalbn and scalbnf
set ERANGE on overflow and on underflow to zero (found by rooklz while
reviewing #12676), so on Linux they did. Both now keep errno across the
host call, as scalbln and scalblnf already do. CheckScalbnErrno checks
results read from the titles' libc.prx.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
ldexpf called the host ldexp on a float, which computes in double and
sets ERANGE only when the double result leaves the double range, so
ldexpf(0x1.3d1c6p-95f, 1262) set ERANGE while ldexpf(1.0f, 200) did
not. The titles' ldexpf never sets errno, as their scalbnf does not.
ldexpf now computes like scalbnf: on 100,000 random arguments it
matches the libc.prx of PPSA07923 and PPSA05916 in every value and
errno, against 63,957 errno differences before.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2^-149 and -2^-141 are exact subnormal powf results that raise no flag,
and 3^-90 is an inexact one that raises FE_UNDERFLOW and FE_INEXACT;
none sets errno, as in the libc.prx of PPSA07923 and PPSA13934.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Titles' libc.prx raises FE_INVALID wherever log10 stores EDOM, a NaN
argument included, where (x - x) / zero raised nothing for a NaN
operand. The domain path now raises through _Feraise, which stores EDOM
and raises the flag in both units. For +-0 it now returns -inf without raising FE_DIVBYZERO, as the titles do; the port divided -two54 by zero.
Results and errno are unchanged. CheckLog10EdgeFlags covers it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
log10 returned the host's log10, whose last bit differs from the titles'
copy on Windows on 3,066,397 of 320 million random arguments. The titles'
copy is the fdlibm e_log10.c over its k_log.h, which FreeBSD 11.4 later
replaced, and it sets EDOM for every nonzero argument with the sign bit set
but leaves errno alone for +-0. log10 now computes that and sets EDOM there.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Titles' libc.prx raises FE_INVALID wherever log2 and log10 stores EDOM, a NaN
argument included, where (x - x) / zero raised nothing for a NaN
operand. The domain path now raises through _Feraise, which stores EDOM
and raises the flag in both units. For +-0 it now returns -inf without raising FE_DIVBYZERO, as the titles do; the port divided -two54 by zero.
Results and errno are unchanged. CheckLog2EdgeFlags and CheckLog10EdgeFlags cover it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
log2 returned the host's log2, whose last bit differs from the titles' copy
on Windows. The titles' copy is the fdlibm e_log2.c over the same k_log.h
kernel as log10, which FreeBSD 11.4 later replaced, and it sets EDOM for
every nonzero argument with the sign bit set but leaves errno alone for
+-0. log2 now computes that over the kernel, renamed KernelLog because both
functions use it, and sets EDOM there.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
log10 returned the host's log10, whose last bit differs from the titles'
copy on Windows on 3,066,397 of 320 million random arguments. The titles'
copy is the fdlibm e_log10.c over its k_log.h, which FreeBSD 11.4 later
replaced, and it sets EDOM for every nonzero argument with the sign bit set
but leaves errno alone for +-0. log10 now computes that and sets EDOM there.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
powf returns sn * tiny * tiny for an underflowing result, as FreeBSD
msun's e_powf.c does, so that the multiplication raises the underflow
and inexact flags. Math.cpp is built without -frounding-math and tiny
was a local constant, so GCC folded the product to zero at compile time
and no flag was raised; titles' libc.prx raises FE_UNDERFLOW with ERANGE.
Read tiny through a volatile, so the product is computed at run time.
The results and errno are unchanged.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
For a negative integer and -inf, titles' libc.prx returns the x86
default NaN (0xffc00000) from tgammaf, where the host tgamma returns
0x7fc00000. Return the titles' NaN when the result is NaN and the
argument is not; errno and the raised flags are unchanged.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
For |x| > 1, the infinities and NaN, titles' libc.prx stores EDOM and
raises FE_INVALID from acosf, quiet NaN included, and asinf also
raises FE_INVALID for a quiet NaN. acosf returned the same NaN bits
without either, and asinf set errno but raised nothing for a quiet NaN.
Both now call _Feraise with the invalid exception, which stores EDOM
and raises the flag in both units; the results are unchanged.
The acosf test asserted the old errno-preserving behaviour from a
FreeBSD reading; it now checks the titles' EDOM and FE_INVALID.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The only conflict was in GuestMath.cpp, where main's sinh tests and this
branch's asinh tests were inserted at the same place. Keep both: the asinh
checks follow the sinh ones.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
tgammaf goes through the host's double tgamma, and Windows UCRT sets
ERANGE at the poles and on double overflow and EDOM for -inf. The
libc.prx that titles ship sets EDOM for a finite negative integer and
leaves errno unchanged for every other argument, including 0, -0, -inf
and overflow. tgammaf now does the same; results are unchanged.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
strtof and wcstof returned the default quiet NaN for any NAN(...)
sequence. The libc.prx bundled with eleven titles reads the payload as
its strtod does, but into one 32-bit word: a blank after the first group
of digits ends it, the first 8 digits are kept and cut to 24 bits, the
result goes under the quiet bit with the sign, and a zero payload
becomes 1. HexNanPayload now takes the word count, two for double and
one for float, and the NaN table test checks the measured float bits
and end for all 64 inputs.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Conflicts with main's newer libc changes resolved without changing either
side: the debt list keeps each side's entry changes (per entry, deletions
included), GuestMath.cpp keeps both sides' test functions and calls, and
Math.cpp differs from main by exactly this branch's own changes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>