This is the mail archive of the libc-help@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Interaction between rounding direction and trigonometric functions



Hi there,


I have the following observation:

$ 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.  I wonder if this is a bug or if I am using sin()
and cos() outside their specification.  I have checked
the glibc manual, but I did not find anything allowing to
answer this question.
All the best,

Roberto

--
Prof. Roberto Bagnara
Computer Science Group
Department of Mathematics, University of Parma, Italy
http://www.cs.unipr.it/~bagnara/
mailto:bagnara@cs.unipr.it




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]