Loading duals/dual +10 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,12 @@ #endif #endif /// Configure whether system has POSIX extern int signgam; #ifndef CPPDUALS_HAVE_SIGNGAM #ifndef _WIN32 #define CPPDUALS_HAVE_SIGNGAM 1 #endif #endif namespace duals { /** Loading Loading @@ -1020,11 +1026,15 @@ template<class T> dual<T> lgamma(const dual<T> & x) { if (x.dpart() == T(0)) return v; else { #if CPPDUALS_HAVE_SIGNGAM int signgam_saved = signgam; #endif int errno_saved = errno; T h(T(1) / (1ull << (std::numeric_limits<T>::digits / 3))); T w((lgamma(x.rpart()+h) - lgamma(x.rpart()-h))/(2*h)); #if CPPDUALS_HAVE_SIGNGAM signgam = signgam_saved; #endif errno = errno_saved; return dual<T>(v, x.dpart() * w); } Loading Loading
duals/dual +10 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,12 @@ #endif #endif /// Configure whether system has POSIX extern int signgam; #ifndef CPPDUALS_HAVE_SIGNGAM #ifndef _WIN32 #define CPPDUALS_HAVE_SIGNGAM 1 #endif #endif namespace duals { /** Loading Loading @@ -1020,11 +1026,15 @@ template<class T> dual<T> lgamma(const dual<T> & x) { if (x.dpart() == T(0)) return v; else { #if CPPDUALS_HAVE_SIGNGAM int signgam_saved = signgam; #endif int errno_saved = errno; T h(T(1) / (1ull << (std::numeric_limits<T>::digits / 3))); T w((lgamma(x.rpart()+h) - lgamma(x.rpart()-h))/(2*h)); #if CPPDUALS_HAVE_SIGNGAM signgam = signgam_saved; #endif errno = errno_saved; return dual<T>(v, x.dpart() * w); } Loading