Bug 6869 - sin() and cos() return grossly wrong results when rounding is set to upward
Summary: sin() and cos() return grossly wrong results when rounding is set to upward
Status: RESOLVED DUPLICATE of bug 3976
Alias: None
Product: glibc
Classification: Unclassified
Component: math (show other bugs)
Version: unspecified
: P2 normal
Target Milestone: ---
Assignee: Andreas Jaeger
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-09-05 19:34 IST by Roberto Bagnara
Modified: 2014-07-02 07:44 IST (History)
2 users (show)

See Also:
Host: athlon64-unknown-linux-gnu
Target:
Build:
Last reconfirmed:
fweimer: security-


Attachments
Testcase allowing to reproduce the problem. (250 bytes, text/plain)
2008-09-05 19:36 IST, Roberto Bagnara
Details
modified version of test program and plot of results (13.17 KB, application/octet-stream)
2008-09-29 16:43 IST, Anders Lennartsson
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Roberto Bagnara 2008-09-05 19:34:41 IST
$ cat bug2.cc
#include <fenv.h>
#include <iostream>
#include <cmath>

int main() {
  double theta = 5.27905511969922880410877041867934167385101318359375;

  std::cout << "theta = " << theta << "\n";
  std::cout << "sin(theta) = " << sin(theta) << "\n";
  std::cout << "cos(theta) = " << cos(theta) << "\n";

  std::cout << "Repeating after setting the rounding direction to UPWARD:"
            << std::endl;

  fesetround(FE_UPWARD);
  std::cout << "theta = " << theta << "\n";
  std::cout << "sin(theta) = " << sin(theta) << "\n";
  std::cout << "cos(theta) = " << cos(theta) << "\n";
}
$ g++ -W -Wall bug2.cc
$ a.out
theta = 5.27906
sin(theta) = -0.843695
cos(theta) = 0.536822
Repeating after setting the rounding direction to UPWARD:
theta = 5.27906
sin(theta) = -0.119458
cos(theta) = 12.1636
$

This happens on a Fedora 7, x86_64  system, with glibc-2.6-4
and GCC 4.3.2.

As you see, after setting the rounding direction to UPWARD,
the results are grossly wrong, to the point of cos() returning
12.1636.  The value computed by second invocation of sin() is
also wrong.
Comment 1 Roberto Bagnara 2008-09-05 19:36:46 IST
Created attachment 2941 [details]
Testcase allowing to reproduce the problem.
Comment 2 Pete Eberlein 2008-09-05 21:19:16 IST
Here are the results for SLES10 SP1, Power6, using Advance
Toolchain GLIBC 2.8, GCC 4.3.1, again very wrong:

theta = 5.27906
sin(theta) = -0.843695
cos(theta) = 0.536822
Repeating after setting the rounding direction to UPWARD:
theta = 5.27906
sin(theta) = -0.0702948
cos(theta) = 9.55255

I also checked the calculation of sin and cos by moving it before setting the
rounding mode and printing it after setting the rounding mode: the correct
results were printed.  This indicates the problem is in sin and cos, and not
with io.
Comment 3 Anders Lennartsson 2008-09-24 10:43:57 IST
The problem may occur on 64-bits only. I compiled and ran the test program on
three computers, all Intel machines running Debian. Two of these use Debian 4.0
Etch, one 32 and one 64-bits, and the problem was present only on 64 bits. It is
still there on a 64-bits machine with Debian unstable.

Etch 32-bits:

theta = 5.27906
sin(theta) = -0.843695
cos(theta) = 0.536822
Repeating after setting the rounding direction to UPWARD:
theta = 5.27906
sin(theta) = -0.843695
cos(theta) = 0.536822

user@computer1:~/gcc$  g++ --v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v
--enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu
--enable-libstdcxx-debug --enable-mpfr --with-tune=i686
--enable-checking=release i486-linux-gnu
Thread model: posix
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)


Etch 64-bits:

theta = 5.27906
sin(theta) = -0.843695
cos(theta) = 0.536822
Repeating after setting the rounding direction to UPWARD:
theta = 5.27906
sin(theta) = -0.212522
cos(theta) = 8.2185

user@computer2:~/gcc$  g++ --v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v
--enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu
--enable-libstdcxx-debug --enable-mpfr --enable-checking=release x86_64-linux-gnu
Thread model: posix
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)

Sid 64-bits:

theta = 5.27906
sin(theta) = -0.843695
cos(theta) = 0.536822
Repeating after setting the rounding direction to UPWARD:
theta = 5.27906
sin(theta) = -0.247529
cos(theta) = 7.26962
user@computer3:/home_2/abel/gcc$ g++ --v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.3.2-1'
--with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared
--with-system-zlib --libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3
--program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug
--enable-objc-gc --enable-mpfr --enable-cld --enable-checking=release
--build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.3.2 (Debian 4.3.2-1) 

Comment 4 Anders Lennartsson 2008-09-29 16:43:31 IST
Created attachment 2967 [details]
modified version of test program and plot of results

There are several intervals for which sine and cosine return wrong results,
when rounding is adjusted according to the original bug report. I modified the
original program to compute values for several angles, and plotted the results.
The program and one plot are attached. As it turns out, not even for all
arguments where |angle|<pi are the results completely correct.
Comment 5 Vincent Lefèvre 2010-03-21 22:24:35 IST

*** This bug has been marked as a duplicate of 3976 ***