------- Comment #5 from tomdean at speakeasy dot org  2010-04-20 01:37 -------
Subject: Re:  Tanh Returns Incorrect Value

On Mon, 2010-04-19 at 23:57 +0000, pinskia at gcc dot gnu dot org wrote:
> 
> ------- Comment #4 from pinskia at gcc dot gnu dot org  2010-04-19 23:57 
> -------
> And tanhl is a GCC issue how?  It is part of glibc and not GCC so please 
> report
> it to them.
> Plus it works for me with:
> libc version 2.7
> libc release stable
> 
> On Debian 5.0.

Sorry, I crossed wires when replying to your previous email.  I have two
problems, one with libc and the other with libstdc++.

and, in gcc-4.4.1/libstdc++-v3/include/std/complex
 template<typename _Tp>
    inline complex<_Tp>
    __complex_tanh(const complex<_Tp>& __z)
    { return std::sinh(__z) / std::cosh(__z); }
...
 template<typename _Tp>
    inline complex<_Tp>
    __complex_sinh(const complex<_Tp>& __z)
    {
      const _Tp __x = __z.real();
      const _Tp  __y = __z.imag();
      return complex<_Tp>(sinh(__x) * cos(__y), cosh(__x) * sin(__y));
    }
...
  template<typename _Tp>
    inline complex<_Tp>
    __complex_cosh(const complex<_Tp>& __z)
    {
      const _Tp __x = __z.real();
      const _Tp __y = __z.imag();
      return complex<_Tp>(cosh(__x) * cos(__y), sinh(__x) * sin(__y));
    }

And, these all seem to resolve to gcc builtin's, like
  __builtin_coshl(__x);, etc.

Is this true?

The code below was compiled with:  g++ test-tanh.cc -o test-tanh-cc

>test-tanh-cc
arg       (50000,50000)
sinh(arg) (-inf,-inf)
cosh(arg) (-inf,-inf)
s/c       (nan,nan)
tanh(arg) (nan,0)

>./test-tanh-cc 5678
arg       (5678,5678)
sinh(arg) (-1.74513e+2465,-3.81804e+2465)
cosh(arg) (-1.74513e+2465,-3.81804e+2465)
s/c       (1,-0)
tanh(arg) (1,2.14543e-4932)

>./text-tanh-cc 5679
arg       (5679,5679)
sinh(arg) (6.17015e+2465,-9.59925e+2465)
cosh(arg) (6.17015e+2465,-9.59925e+2465)
s/c       (1,-0)
tanh(arg) (nan,-0)

> cat test-tanh.cc
#include <iostream>
#include <complex>
#include <gnu/libc-version.h>
#include <stdlib.h> // atol
using namespace std;
int main(int argc, char **argv) {
  long mult;
  if (argc == 2) {
        mult = atol(argv[1]);
  } else {
        mult = 50000L;
  }
  complex<long double> arg(1,1);
  arg *= mult;
  complex<long double> s,c,r,t;
  s=sinh(arg);
  c=cosh(arg);
  r=s/c;
  t=tanh(arg);  
  cout << "libc version " << gnu_get_libc_version() << endl;
  cout << "arg       " << arg << endl;
  cout << "sinh(arg) " << s << endl;
  cout << "cosh(arg) " << c << endl;
  cout << "s/c       " << r << endl;
  cout << "tanh(arg) " << t << endl;
  return 0;
}


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43802

Reply via email to