From f684fc4d58acf051e4238bcdda28cf787fcc12cf Mon Sep 17 00:00:00 2001 From: Oskar Laverny Date: Tue, 22 Sep 2026 15:46:43 +0200 Subject: [PATCH] erfcinv/erfinv bigfloat: relax newton tolerence --- src/erf.jl | 4 ++-- test/erf.jl | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) 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