Skip to content

Commit 42bb273

Browse files
authored
fix type-instability of logabsbeta (#332)
* fix type-instability of logabsbeta * make logabsgamma also return Int
1 parent 5f0a078 commit 42bb273

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

src/gamma.jl

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -620,12 +620,12 @@ gamma(x::Number) = gamma(float(x))
620620
function logabsgamma(x::Float64)
621621
signp = Ref{Int32}()
622622
y = ccall((:lgamma_r,libm), Float64, (Float64, Ptr{Int32}), x, signp)
623-
return y, signp[]
623+
return y, Int(signp[])
624624
end
625625
function logabsgamma(x::Float32)
626626
signp = Ref{Int32}()
627627
y = ccall((:lgammaf_r,libm), Float32, (Float32, Ptr{Int32}), x, signp)
628-
return y, signp[]
628+
return y, Int(signp[])
629629
end
630630
logabsgamma(x::Real) = logabsgamma(float(x))
631631
logabsgamma(x::Float16) = Float16.(logabsgamma(Float32(x)))
@@ -668,7 +668,7 @@ loggamma(x::Number) = loggamma(float(x))
668668

669669
function loggamma(x::Real)
670670
(y, s) = logabsgamma(x)
671-
s < 0.0 && throw(DomainError(x, "`gamma(x)` must be non-negative"))
671+
s < 0 && throw(DomainError(x, "`gamma(x)` must be non-negative"))
672672
return y
673673
end
674674

@@ -808,7 +808,8 @@ function logabsbeta(a::T, b::T) where T<:Real
808808
if a <= 0 && isinteger(a)
809809
if a + b <= 0 && isinteger(b)
810810
r = logbeta(1 - a - b, b)
811-
sgn = iseven(Int(b)) ? 1 : -1
811+
# in julia ≥ 1.7, iseven doesn't require Int (julia#38976)
812+
sgn = iseven(@static VERSION v"1.7" ? b : Int(b)) ? 1 : -1
812813
return r, sgn
813814
else
814815
return -log(zero(a)), 1
@@ -825,7 +826,7 @@ function logabsbeta(a::T, b::T) where T<:Real
825826
ya, sa = logabsgamma(a)
826827
yb, sb = logabsgamma(b)
827828
yab, sab = logabsgamma(a + b)
828-
(ya + yb - yab), (sa*sb*sab)
829+
(ya + yb - yab), Int(sa*sb*sab)
829830
end
830831
logabsbeta(a::Real, b::Real) = logabsbeta(promote(a, b)...)
831832

@@ -838,12 +839,12 @@ function logabsgamma(x::BigFloat)
838839
z = BigFloat()
839840
lgamma_signp = Ref{Cint}()
840841
ccall((:mpfr_lgamma,:libmpfr), Cint, (Ref{BigFloat}, Ref{Cint}, Ref{BigFloat}, Int32), z, lgamma_signp, x, ROUNDING_MODE[])
841-
return z, lgamma_signp[]
842+
return z, Int(lgamma_signp[])
842843
end
843844

844845
function loggamma(x::BigFloat)
845846
(y, s) = logabsgamma(x)
846-
s < 0.0 && throw(DomainError(x, "`gamma(x)` must be non-negative"))
847+
s < 0 && throw(DomainError(x, "`gamma(x)` must be non-negative"))
847848
return y
848849
end
849850
if Base.MPFR.version() >= v"4.0.0"

0 commit comments

Comments
 (0)