diff --git a/src/erf.jl b/src/erf.jl index 79f6afe5..95943890 100644 --- a/src/erf.jl +++ b/src/erf.jl @@ -555,7 +555,7 @@ function _erfinv(y::BigFloat) isfinite(x) || return x end sqrtπhalf = sqrtπ * big(0.5) - tol = 2eps(abs(x)) + tol = 2max(eps(abs(y)),eps(abs(x))) while true # Newton iterations Δx = sqrtπhalf * (erf(x) - y) * exp(x^2) x -= Δx @@ -695,7 +695,7 @@ function _erfcinv(y::BigFloat) isfinite(x) || return x end sqrtπhalf = sqrtπ * big(0.5) - tol = 2eps(abs(x)) + tol = 2max(eps(abs(y)),eps(abs(x))) while true # Newton iterations Δx = sqrtπhalf * (erfc(x) - y) * exp(x^2) x += Δx diff --git a/test/erf.jl b/test/erf.jl index d402989b..62e5c18d 100644 --- a/test/erf.jl +++ b/test/erf.jl @@ -145,6 +145,10 @@ @test_throws DomainError erfinv(x) @test_throws DomainError erfcinv(1-x) end + + # Those two values were hanging before, see issue #557 + @test erfcinv(2big"0.8") ≈ erfcinv(2big(0.8)) rtol= 2eps() + @test erfcinv(2big"0.41") ≈ erfcinv(2big(0.41)) rtol= 2eps() end @testset "Other float types" begin