From 0f7bb97c025e9e38f89d206a018574725f3771ce Mon Sep 17 00:00:00 2001 From: araujoms Date: Fri, 29 Mar 2024 08:50:04 +0100 Subject: [PATCH 1/5] add logabsgamma --- src/specfun.jl | 7 ++++++- test/specfun.jl | 5 ++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/specfun.jl b/src/specfun.jl index c25907c..7592bdb 100644 --- a/src/specfun.jl +++ b/src/specfun.jl @@ -1,6 +1,6 @@ import .SpecialFunctions import .SpecialFunctions: erf, erfc, besselj0, besselj1, bessely0, bessely1, - besselj, bessely, gamma, lgamma + besselj, bessely, gamma, lgamma, logabsgamma erf(x::Float128) = Float128(@ccall(libquadmath.erfq(x::Cfloat128)::Cfloat128)) @@ -26,3 +26,8 @@ gamma(x::Float128) = Float128(@ccall(libquadmath.tgammaq(x::Cfloat128)::Cfloat128)) lgamma(x::Float128) = Float128(@ccall(libquadmath.lgammaq(x::Cfloat128)::Cfloat128)) + +function logabsgamma(x::Float128) + sign = x >= 0 ? 1 : 2*mod(ceil(Int64,x),2)-1 + return lgamma(x), sign +end diff --git a/test/specfun.jl b/test/specfun.jl index aa44201..8554509 100644 --- a/test/specfun.jl +++ b/test/specfun.jl @@ -6,10 +6,13 @@ using SpecialFunctions piq = Float128(pi) halfq = Float128(0.5) @test gamma(halfq) ≈ sqrt(piq) - for func in (erf, erfc, besselj0, besselj1, bessely0, bessely1, lgamma) + for func in (erf, erfc, besselj0, besselj1, bessely0, bessely1, loggamma) @test func(halfq) ≈ func(0.5) end for func in (bessely, besselj) @test func(3,halfq) ≈ func(3,0.5) end + @test gamma(Float128(2),3) ≈ gamma(2,3) + @test all(logabsgamma(Float128(-0.5)) .≈ logabsgamma(-0.5)) + @test all(logabsgamma(Float128(-1.5)) .≈ logabsgamma(-1.5)) end From 7d25d9d717ae98685f27a5da4b9ab533fca28213 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateus=20Ara=C3=BAjo?= Date: Thu, 4 Apr 2024 08:00:50 +0200 Subject: [PATCH 2/5] Update src/specfun.jl Co-authored-by: RalphAS --- src/specfun.jl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/specfun.jl b/src/specfun.jl index 7592bdb..c7b1bf0 100644 --- a/src/specfun.jl +++ b/src/specfun.jl @@ -28,6 +28,10 @@ lgamma(x::Float128) = Float128(@ccall(libquadmath.lgammaq(x::Cfloat128)::Cfloat128)) function logabsgamma(x::Float128) - sign = x >= 0 ? 1 : 2*mod(ceil(Int64,x),2)-1 + if isfinite(x) + sign = x >= 0 ? 1 : 2*mod(ceil(Int64,x),2)-1 + else + sign = 1 + end return lgamma(x), sign end From 1c4fb18e95986d96060a0f48733085bb0bbbb9ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateus=20Ara=C3=BAjo?= Date: Thu, 4 Apr 2024 14:28:48 +0200 Subject: [PATCH 3/5] Update src/specfun.jl Co-authored-by: David Widmann --- src/specfun.jl | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/specfun.jl b/src/specfun.jl index c7b1bf0..bd3a246 100644 --- a/src/specfun.jl +++ b/src/specfun.jl @@ -28,10 +28,6 @@ lgamma(x::Float128) = Float128(@ccall(libquadmath.lgammaq(x::Cfloat128)::Cfloat128)) function logabsgamma(x::Float128) - if isfinite(x) - sign = x >= 0 ? 1 : 2*mod(ceil(Int64,x),2)-1 - else - sign = 1 - end + sign = !isfinite(x) || x >= 0 || !iszero(mod(ceil(x), 2)) ? 1 : -1 return lgamma(x), sign end From 80b6f9c04d62b82bb0ed2dbf92a27a2134c0cfea Mon Sep 17 00:00:00 2001 From: araujoms Date: Thu, 4 Apr 2024 14:35:15 +0200 Subject: [PATCH 4/5] match sign also for negative integers --- src/specfun.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/specfun.jl b/src/specfun.jl index bd3a246..5424e87 100644 --- a/src/specfun.jl +++ b/src/specfun.jl @@ -28,6 +28,7 @@ lgamma(x::Float128) = Float128(@ccall(libquadmath.lgammaq(x::Cfloat128)::Cfloat128)) function logabsgamma(x::Float128) - sign = !isfinite(x) || x >= 0 || !iszero(mod(ceil(x), 2)) ? 1 : -1 - return lgamma(x), sign + result = lgamma(x) + sign = !isfinite(result) || x >= 0 || !iszero(mod(ceil(x), 2)) ? 1 : -1 + return result, sign end From 7d5b5b56b035352b677589e66a6f8de0bb9100b9 Mon Sep 17 00:00:00 2001 From: araujoms Date: Thu, 4 Apr 2024 14:56:42 +0200 Subject: [PATCH 5/5] remove deprecated lgamma (SpecialFunctions will take care of it) --- src/specfun.jl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/specfun.jl b/src/specfun.jl index 5424e87..69a6498 100644 --- a/src/specfun.jl +++ b/src/specfun.jl @@ -1,6 +1,6 @@ import .SpecialFunctions import .SpecialFunctions: erf, erfc, besselj0, besselj1, bessely0, bessely1, - besselj, bessely, gamma, lgamma, logabsgamma + besselj, bessely, gamma, logabsgamma erf(x::Float128) = Float128(@ccall(libquadmath.erfq(x::Cfloat128)::Cfloat128)) @@ -24,11 +24,9 @@ bessely(n::Integer, x::Float128) = gamma(x::Float128) = Float128(@ccall(libquadmath.tgammaq(x::Cfloat128)::Cfloat128)) -lgamma(x::Float128) = - Float128(@ccall(libquadmath.lgammaq(x::Cfloat128)::Cfloat128)) function logabsgamma(x::Float128) - result = lgamma(x) + result = Float128(@ccall(libquadmath.lgammaq(x::Cfloat128)::Cfloat128)) sign = !isfinite(result) || x >= 0 || !iszero(mod(ceil(x), 2)) ? 1 : -1 return result, sign end