$ 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.
Created attachment 2941 [details] Testcase allowing to reproduce the problem.
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.
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)
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.
*** This bug has been marked as a duplicate of 3976 ***