TR1 Special Math

Florian Goth CaptainSifff@gmx.de
Sat May 9 14:40:00 GMT 2015


Hi Jonathan,
yes my copyright assignment has been completed in the meantime.
Cheers,
Florian.


> Gesendet: Freitag, 08. Mai 2015 um 18:04 Uhr
> Von: "Florian Goth" <CaptainSifff@gmx.de>
> An: "Ed Smith-Rowland" <3dw4rd@verizon.net>
> Cc: libstdc++ <libstdc++@gcc.gnu.org>
> Betreff: Aw: Re: TR1 Special Math
>
> Hi all,
> I think this might be the time for merging the attached, regenerated patch for the Zeta function, as well as my contribution of the PolyLog?
> Cheers,
> Florian.
> 
> 
> See also the original post:
> https://gcc.gnu.org/ml/libstdc++/2014-08/msg00033.html
> 
> index 19def70..43a8b18 100644
> --- a/libstdc++-v3/include/tr1/riemann_zeta.tcc
> +++ b/libstdc++-v3/include/tr1/riemann_zeta.tcc
> @@ -155,8 +155,8 @@ namespace tr1
>  
>        const _Tp __eps = std::numeric_limits<_Tp>::epsilon();
>        //  Max e exponent before overflow.
> -      const _Tp __max_bincoeff = std::numeric_limits<_Tp>::max_exponent10
> -                               * std::log(_Tp(10)) - _Tp(1);
> +      const _Tp __max_bincoeff = std::exp(std::numeric_limits<_Tp>::max_exponent10
> +                               * std::log(_Tp(10)) - _Tp(1));
>  
>        //  This series works until the binomial coefficient blows up
>        //  so use reflection.
> @@ -182,33 +182,25 @@ namespace tr1
>              }
>          }
>  
> -      _Tp __num = _Tp(0.5L);
> +      _Tp __num = _Tp(0.5L*0.5L);
>        const unsigned int __maxit = 10000;
> -      for (unsigned int __i = 0; __i < __maxit; ++__i)
> +      __zeta = _Tp(0.5L);//zeroth order contribution already calculated
> +      for (unsigned int __i = 1; __i < __maxit; ++__i)
>          {
>            bool __punt = false;
> -          _Tp __sgn = _Tp(1);
> -          _Tp __term = _Tp(0);
> -          for (unsigned int __j = 0; __j <= __i; ++__j)
> +          _Tp __term = _Tp(1.0);//again the zeroth order
> +          _Tp __bincoeff = _Tp(1);
> +          for (unsigned int __j = 1; __j <= __i; ++__j)
>              {
> -#if _GLIBCXX_USE_C99_MATH_TR1
> -              _Tp __bincoeff =  std::tr1::lgamma(_Tp(1 + __i))
> -                              - std::tr1::lgamma(_Tp(1 + __j))
> -                              - std::tr1::lgamma(_Tp(1 + __i - __j));
> -#else
> -              _Tp __bincoeff =  __log_gamma(_Tp(1 + __i))
> -                              - __log_gamma(_Tp(1 + __j))
> -                              - __log_gamma(_Tp(1 + __i - __j));
> -#endif
> -              if (__bincoeff > __max_bincoeff)
> -                {
> -                  //  This only gets hit for x << 0.
> -                  __punt = true;
> -                  break;
> -                }
> -              __bincoeff = std::exp(__bincoeff);
> -              __term += __sgn * __bincoeff * std::pow(_Tp(1 + __j), -__s);
> -              __sgn *= _Tp(-1);
> +              _Tp incr = _Tp(__i - __j + 1)/__j;
> +              __bincoeff *= -incr;
> +              if(std::fabs(__bincoeff) > __max_bincoeff )
> +              {
> +                //  This only gets hit for x << 0.
> +                __punt = true;
> +                break;
> +              }
> +              __term += __bincoeff * std::pow(_Tp(1 + __j), -__s);
>              }
>            if (__punt)
>              break;
> 
> 
> > Gesendet: Freitag, 08. Mai 2015 um 16:05 Uhr
> > Von: "Ed Smith-Rowland" <3dw4rd@verizon.net>
> > An: "Jonathan Wakely" <jwakely.gcc@gmail.com>, libstdc++ <libstdc++@gcc.gnu.org>
> > Betreff: Re: TR1 Special Math
> >
> > On 05/07/2015 12:06 PM, Jonathan Wakely wrote:
> > > Hi Ed,
> > >
> > > The C++ committee is considering the
> > > http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4437.pdf
> > > proposal to make C++17 include the contents of ISO 29124:2010 (the
> > > special math functions from TR1 that went into a separate standard,
> > > not into C++11).
> > >
> > > What is the status of our TR1 implementation? Is it complete? Good
> > > enough quality to move out of the tr1 sub-dir?
> > >
> > > Even if N4437 isn't accepted for C++17 we could move things around to
> > > turn the TR1 code into an iso29124 implementation, do you think that
> > > would make sense?
> > >
> > That would make absolute sense.
> > I actually have a tree where I've done that.
> > All the functions are in there (29124 removed the hypergeometric 
> > functions.  I'd like to keep those as extensions.
> > I have some bugfixes also.
> > 
> > I have a better version of the Carlson elliptic functions (which are 
> > used in the 29124 elliptic functions).
> > 
> > Ed
> > 
> > 
> 



More information about the Libstdc++ mailing list