[Bug c++/64497] std::scalbln does not round correctly for long doubles
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64497 Jakub Jelinek jakub at gcc dot gnu.org changed: What|Removed |Added Status|UNCONFIRMED |RESOLVED CC||jakub at gcc dot gnu.org Resolution|--- |INVALID --- Comment #6 from Jakub Jelinek jakub at gcc dot gnu.org --- Closing as this is definitely not a GCC issue. Please file it against glibc instead. Note, on x86_64, scalbnl is implemented in assembly, while scalblnl is not.
[Bug c++/64497] std::scalbln does not round correctly for long doubles
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64497 --- Comment #3 from Jonathan Wakely redi at gcc dot gnu.org --- (In reply to Walter Mascarenhas from comment #2) What if there is a difference in the expected behavior for this function in C and C++11? There isn't any difference, so it doesn't matter. Is it not up to g++ for implementing what is mandated in C++11? (This is not a rhetorical question, I really do not know the answer.) Yes. On the other hand, http://en.cppreference.com/w/cpp/numeric/math/scalbn states that If a range error due to underflow occurs, the correct result (after rounding) is returned. The C++ standard doesn't say that. I looked at the standard (N3797.pdf) but did not find anything specific about std::scalbln. It says it is the same as C, so cppreference.com is wrong.
[Bug c++/64497] std::scalbln does not round correctly for long doubles
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64497 --- Comment #4 from Jonathan Wakely redi at gcc dot gnu.org --- Looking at the C standard, it seems that the result is implementation-defined on underflow, and zero is a valid result. C++ doesn't change that.
[Bug c++/64497] std::scalbln does not round correctly for long doubles
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64497 --- Comment #1 from Jonathan Wakely redi at gcc dot gnu.org --- GCC just calls the scalnlnl() function in libm, so it's not a GCC bug, and is not specific to C++ either. I suggest you report it to your libc vendor. Complete testcase in C: #include stdio.h #include math.h #include assert.h int main() { long double di = scalbnl(1.1L, -16446); assert( di != 0.0L ); long double dl = scalblnl(1.1L, -16446L); assert( dl != 0.0L ); }
[Bug c++/64497] std::scalbln does not round correctly for long doubles
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64497 --- Comment #2 from Walter Mascarenhas walter.mascarenhas at gmail dot com --- What if there is a difference in the expected behavior for this function in C and C++11? Is it not up to g++ for implementing what is mandated in C++11? (This is not a rhetorical question, I really do not know the answer.) In http://man7.org/linux/man-pages/man3/scalbn.3.html it is written that scalbln should return 0 in case of underflow: If the result underflows, a range error occurs, and the functions return zero, with a sign the same as *x*. On the other hand, http://en.cppreference.com/w/cpp/numeric/math/scalbn states that If a range error due to underflow occurs, the correct result (after rounding) is returned. I looked at the standard (N3797.pdf) but did not find anything specific about std::scalbln. If there is indeed a discrepancy in the definitions of scalbln in C and C++11 then there may be no bug in libm, and my vendor will not change it. I do not have a copy of the ISO 60599 standard, and I do not know whether the content of the pages http://man7.org/linux/man-pages/man3/scalbn.3.html and http://en.cppreference.com/w/cpp/numeric/math/scalbn are compatible with any standards. Therefore I am in no position to argue, but maybe you could think a bit longer about this.. On Mon, Jan 5, 2015 at 10:29 AM, redi at gcc dot gnu.org gcc-bugzi...@gcc.gnu.org wrote: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64497 --- Comment #1 from Jonathan Wakely redi at gcc dot gnu.org --- GCC just calls the scalnlnl() function in libm, so it's not a GCC bug, and is not specific to C++ either. I suggest you report it to your libc vendor. Complete testcase in C: #include stdio.h #include math.h #include assert.h int main() { long double di = scalbnl(1.1L, -16446); assert( di != 0.0L ); long double dl = scalblnl(1.1L, -16446L); assert( dl != 0.0L ); } -- You are receiving this mail because: You are on the CC list for the bug. You reported the bug.
[Bug c++/64497] std::scalbln does not round correctly for long doubles
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64497 Sergey Zubkov cubbi at cubbi dot org changed: What|Removed |Added CC||cubbi at cubbi dot org --- Comment #5 from Sergey Zubkov cubbi at cubbi dot org --- FYI, cppreference got that phrasing from POSIX's If the correct value would cause underflow, and is representable, a range error may occur and the correct value shall be returned., which is a part of its optional IEC 60559 Floating-Point extension to the C standard: http://pubs.opengroup.org/onlinepubs/9699919799/functions/scalbln.html