From 8653eb63aacfcd7015e8e8abbfb55681d040061a Mon Sep 17 00:00:00 2001 From: Alexander Voigt Date: Sun, 20 Apr 2025 14:22:06 +0200 Subject: [PATCH 1/3] use generic conversion to appropriate floating point --- src/Factorial.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Factorial.jl b/src/Factorial.jl index 40caba2..75fdfe3 100644 --- a/src/Factorial.jl +++ b/src/Factorial.jl @@ -143,7 +143,7 @@ function fac_big(n::Integer)::BigFloat if n < 0 throw(DomainError(n, "fac not implemented for n < 0")) else - BigFloat(factorial(big(n))) + float(factorial(big(n))) end end @@ -170,6 +170,6 @@ function inv_fac_big(n::Integer)::BigFloat if n < 0 throw(DomainError(n, "inv_fac not implemented for n < 0")) else - BigFloat(inv(factorial(big(n)))) + float(inv(factorial(big(n)))) end end From 68f0ec6d32932089f61643469f5496c71a9762b5 Mon Sep 17 00:00:00 2001 From: Alexander Voigt Date: Sun, 20 Apr 2025 14:41:43 +0200 Subject: [PATCH 2/3] merge factorial functions The fac function is now slightly more generic --- src/Factorial.jl | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/src/Factorial.jl b/src/Factorial.jl index 75fdfe3..ad3b26a 100644 --- a/src/Factorial.jl +++ b/src/Factorial.jl @@ -122,26 +122,14 @@ const INVERSE_FACTORIALS = ( # returns n! for n >= 0 function fac(n::Integer, ::Type{T})::T where T - if issimplefloat(T) - convert(T, fac_f64(n)) - else - fac_big(n) - end -end - -function fac_f64(n::Integer)::Float64 - if n < 0 - throw(DomainError(n, "fac not implemented for n < 0")) - elseif n + 1 <= length(FACTORIALS) - FACTORIALS[n + 1] - else - Inf - end -end - -function fac_big(n::Integer)::BigFloat if n < 0 throw(DomainError(n, "fac not implemented for n < 0")) + elseif issimplefloat(T) + if n + 1 <= length(FACTORIALS) + convert(T, FACTORIALS[n + 1]) + else + convert(T, Inf) + end else float(factorial(big(n))) end From 30c8094cf1a08a48c2f8efa75aa41f45583d01ec Mon Sep 17 00:00:00 2001 From: Alexander Voigt Date: Sun, 20 Apr 2025 14:55:08 +0200 Subject: [PATCH 3/3] refactor inv_fac --- src/Factorial.jl | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/src/Factorial.jl b/src/Factorial.jl index ad3b26a..9451a4b 100644 --- a/src/Factorial.jl +++ b/src/Factorial.jl @@ -128,7 +128,7 @@ function fac(n::Integer, ::Type{T})::T where T if n + 1 <= length(FACTORIALS) convert(T, FACTORIALS[n + 1]) else - convert(T, Inf) + T(Inf) end else float(factorial(big(n))) @@ -137,26 +137,14 @@ end # returns 1/n! for n >= 0 function inv_fac(n::Integer, ::Type{T})::T where T - if issimplefloat(T) - convert(T, inv_fac_f64(n)) - else - inv_fac_big(n) - end -end - -function inv_fac_f64(n::Integer)::Float64 - if n < 0 - throw(DomainError(n, "inv_fac not implemented for n < 0")) - elseif n + 1 <= length(INVERSE_FACTORIALS) - INVERSE_FACTORIALS[n + 1] - else - 0.0 - end -end - -function inv_fac_big(n::Integer)::BigFloat if n < 0 throw(DomainError(n, "inv_fac not implemented for n < 0")) + elseif issimplefloat(T) + if n + 1 <= length(INVERSE_FACTORIALS) + convert(T, INVERSE_FACTORIALS[n + 1]) + else + zero(T) + end else float(inv(factorial(big(n)))) end