[Bug 2076653] Re: sincos does not give same values as separate sin and cos
Carl Dehlin
2076653 at bugs.launchpad.net
Mon Aug 12 19:22:20 UTC 2024
Found duplicate bug report in glibc bug tracker: https://sourceware.org/bugzilla/show_bug.cgi?id=29193
This is fixed in glibc 2.36
** Bug watch added: Sourceware.org Bugzilla #29193
https://sourceware.org/bugzilla/show_bug.cgi?id=29193
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to glibc in Ubuntu.
https://bugs.launchpad.net/bugs/2076653
Title:
sincos does not give same values as separate sin and cos
Status in glibc package in Ubuntu:
New
Bug description:
sincos does not give the same result as sin and cos for certain double
precision floating point values.
As documented at https://sourceware.org/glibc/manual/latest/html_mono/libc.html#Known-Maximum-Errors-in-Math-Functions , all three functions have error up to 1 ulp on x86_64 from the correctly rounded value.
However, I can find no documentation that sincos might give different values than sin and cos (https://sourceware.org/glibc/manual/latest/html_mono/libc.html#index-sincos).
This might seem like a non-issue, until compilers assume that a pair of sin and cos can be optimized to a sincos call without turning on fast/unsafe math optimizations.
To reproduce, compile the following test case with gcc -ffloat-store
-fexcess-precision=standard -mfpmath=sse -lm (floating point settings
is to ensure there can not be any issue with excess precision on
x86_64) and run it with
1.2475784324341769870869711667182855308055877685546875 fed to stdin
(random precision value found in a fuzz test, the literal can
perfectly represented by a double).
=====================
Test case source code
=====================
#define _GNU_SOURCE
#include <assert.h>
#include <math.h>
#include <stdio.h>
int main()
{
double x;
if (!scanf("%lf", &x)) {
return 1;
}
double c, s;
sincos(x, &s, &c);
printf("sin(x) = %a\ncos(x) = %a\n", s, c);
printf("cos(x) = %a\n", cos(x));
assert(c == cos(x));
return 0;
}
================
Test case output
================
sin(x) = 0x1.e57cdd3c834a3p-1
cos(x) = 0x1.453e098c304afp-2
cos(x) = 0x1.453e098c304bp-2
a.out: sincos.c:16: main: Assertion `c == cos(x)' failed.
Aborted (core dumped)
==================
System information
==================
OS version : Ubuntu 22.04.2 LTS
libc6 version: 2.35-0ubuntu3.8 [installed through build-essential]
gcc version: gcc (Ubuntu 11.4.0-1ubuntu1~22.04) [installed through build-essential]
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/2076653/+subscriptions
More information about the foundations-bugs
mailing list