diff --git a/docs/src/functions_list.md b/docs/src/functions_list.md index 5890373f..80716d7b 100644 --- a/docs/src/functions_list.md +++ b/docs/src/functions_list.md @@ -78,6 +78,7 @@ ncF expint expinti expintx +li sinint cosint ``` diff --git a/docs/src/functions_overview.md b/docs/src/functions_overview.md index 6cea9b02..6be48453 100644 --- a/docs/src/functions_overview.md +++ b/docs/src/functions_overview.md @@ -39,6 +39,7 @@ Here the *Special Functions* are listed according to the structure of [NIST Digi | [`expintx(x)`](@ref SpecialFunctions.expintx) | scaled [exponential integral](https://en.wikipedia.org/wiki/Exponential_integral) ``e^z \operatorname{E}_\nu(z)`` | | [`sinint(x)`](@ref SpecialFunctions.sinint) | [sine integral](https://en.wikipedia.org/wiki/Trigonometric_integral#Sine_integral) ``\operatorname{Si}(x)`` | | [`cosint(x)`](@ref SpecialFunctions.cosint) | [cosine integral](https://en.wikipedia.org/wiki/Trigonometric_integral#Cosine_integral) ``\operatorname{Ci}(x)`` | +| [`li(x)`](@ref SpecialFunctions.li) | [logarithmic integral function](https://en.wikipedia.org/wiki/Logarithmic_integral_function) ``\operatorname{li}(x)`` | ## Error Functions, Dawson’s and Fresnel Integrals diff --git a/src/SpecialFunctions.jl b/src/SpecialFunctions.jl index 0d296cc0..a0828c07 100644 --- a/src/SpecialFunctions.jl +++ b/src/SpecialFunctions.jl @@ -90,6 +90,7 @@ export expintx, sinint, cosint, + li, lbinomial include("bessel.jl") diff --git a/src/expint.jl b/src/expint.jl index 4e6af64a..b21bcb0f 100644 --- a/src/expint.jl +++ b/src/expint.jl @@ -610,3 +610,28 @@ function expinti(x::BigFloat) ccall((:mpfr_eint, :libmpfr), Int32, (Ref{BigFloat}, Ref{BigFloat}, Base.MPFR.MPFRRoundingMode), z, x, Base.MPFR.ROUNDING_MODE[]) return z end + +############################################################################## +# Logarithmic integral function li + +@doc raw""" + li(x::Real) + +Computes the Logarithmic integral function +```math +\operatorname{li}(x) = \int_{0}^x \frac{1}{\ln{t}} \mathrm{d}t, +``` +which is equivalent to ``\operatorname{Ei}(\ln{x})`` where +``\operatorname{Ei}`` is the `expinti` function. + +External links: [Wikipedia](https://en.wikipedia.org/wiki/Logarithmic_integral_function) +""" +function li(x::Real) + if x < 0 + throw(DomainError(x, "negative argument, convert to complex first")) + elseif x == 0 + return zero(typeof(x)) + else + return expinti(log(x)) + end +end diff --git a/test/expint.jl b/test/expint.jl index d25e92a2..40428001 100644 --- a/test/expint.jl +++ b/test/expint.jl @@ -245,3 +245,13 @@ expinti_real(x) = invoke(expinti, Tuple{Real}, x) end end end + +@testset "Logarithmic integral function" begin + @test @inferred(li(0.0)) === 0.0 # float 64 + @test @inferred(li(0.0f0)) === 0.0f0 # float 32 + @test @inferred(li(Float16(0))) === Float16(0) # float 16 + + @test @inferred(li(1.0)) === -Inf + @test @inferred(li(Inf)) === Inf + @test @inferred(li(2)) ≈ 1.0451637801174927 # this errors idk why +end \ No newline at end of file