This is the mail archive of the
libc-help@sourceware.org
mailing list for the glibc project.
Interaction between rounding direction and trigonometric functions
- From: Roberto Bagnara <bagnara at cs dot unipr dot it>
- To: libc-help at sourceware dot org
- Date: Fri, 05 Sep 2008 19:29:42 +0200
- Subject: Interaction between rounding direction and trigonometric functions
- Organization: Department of Mathematics, University of Parma, Italy
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