在 2023/11/24 下午6:30, Xi Ruoyao 写道:
On Fri, 2023-11-24 at 17:46 +0800, chenglulu wrote:
It's just that I'm confused that the description of rint in n2310,
including Joseph's email,
all say that rint will not set errno, but linux-man says "which might
set errno to ERANGE" .
Annex F has:
The C floating types match the IEC 60559 formats as follows:
- The float type matches the IEC 60559 single format.
- The double type matches the IEC 60559 double format.
With these constraints rint and rintf just cannot have a range or domain
error. So Annex F does not say rint may set errno. Linux-man says:
ERRORS
No errors occur. POSIX.1‐2001 documents a range error for overflows,
but see NOTES.
It's because POSIX does not mandates float/double to match the IEC 60559
formats, thus a range error may happen with some strange floating point
formats. The NOTES says "this won't happen for IEC 60559 formats".
For lrint, N2310 says:
If the rounded value is outside the range of the return type, the
numeric result is unspecified and a domain error or range error may
occur.
So a EDOM or ERANGE may be set. On the contrary, the man page says:
The following errors can occur:
Domain error: x is a NaN or infinite, or the rounded value is too large
An invalid floating‐point exception (FE_INVALID) is raised.
These functions do not set errno.
The last paragraph is Glibc-specific, and it's considered a Glibc bug
(https://sourceware.org/bugzilla/show_bug.cgi?id=6798).
Ok, the question is clear, I have no objection.