[Bug 2076653] [NEW] sincos does not give same values as separate sin and cos

Carl Dehlin 2076653 at bugs.launchpad.net
Mon Aug 12 14:52:45 UTC 2024


Public bug reported:

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]

** Affects: glibc (Ubuntu)
     Importance: Undecided
         Status: New

-- 
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