|
| 1 | +# From openlibm/test/libm-test-ulps.h, openlibm/test/libm-test.c |
| 2 | + |
| 3 | +using SpecialFunctions: _lgamma_r, _loggamma_r, _lgammaf_r, _loggammaf_r |
| 4 | + |
| 5 | +# lgamma_test block |
| 6 | +for (T, lgamma, labsgamma) in ((Float64, _loggamma_r, _lgamma_r), |
| 7 | + (Float32, _loggammaf_r, _lgammaf_r)) |
| 8 | + @testset "lgamma_test, $T" begin |
| 9 | + @test lgamma(T(Inf)) === T(Inf) |
| 10 | + @test lgamma(T(0)) === T(Inf) |
| 11 | + @test lgamma(T(NaN)) === T(NaN) |
| 12 | + |
| 13 | + @test lgamma(T(-3)) === T(Inf) |
| 14 | + @test lgamma(T(-Inf)) === T(Inf) |
| 15 | + |
| 16 | + # lgamma(1) == 0, lgamma (1) sets signgam to 1 |
| 17 | + y, signgam = labsgamma(T(1)) |
| 18 | + @test y === T(0.0) |
| 19 | + @test signgam == 1 |
| 20 | + |
| 21 | + # lgamma(3) == log(2), lgamma (3) sets signgam to 1 |
| 22 | + y, signgam = labsgamma(T(3)) |
| 23 | + @test y === log(T(2.0)) |
| 24 | + @test signgam == 1 |
| 25 | + |
| 26 | + # lgamma(0.5) == log(sqrt(pi)), lgamma(0.5) sets signgam to 1 |
| 27 | + y, signgam = labsgamma(T(0.5)) |
| 28 | + @test y === T(0.5log(π)) |
| 29 | + @test signgam == 1 |
| 30 | + |
| 31 | + # lgamma(-0.5) == log(2sqrt(pi)), lgamma(-0.5) sets signgam to -1 |
| 32 | + y, signgam = labsgamma(T(-0.5)) |
| 33 | + @test y === T(0.5log(4π)) |
| 34 | + @test signgam == -1 |
| 35 | + @test_throws DomainError lgamma(T(-0.5)) |
| 36 | + |
| 37 | + # In the two "broken" tests, an exact match not possible, even |
| 38 | + # in Float64, thus, we check for as close a tolerance as |
| 39 | + # possible. |
| 40 | + |
| 41 | + # lgamma(0.7) == 0.26086724653166651439, lgamma(0.7) sets signgam to 1 |
| 42 | + y, signgam = labsgamma(T(0.7)) |
| 43 | + # @test_broken y === 0.26086724653166651439 |
| 44 | + if T === Float64 |
| 45 | + @test y ≈ 0.26086724653166651439 atol=6e-17 |
| 46 | + else |
| 47 | + @test y ≈ 0.26086724653166651439 atol=3e-8 |
| 48 | + end |
| 49 | + @test signgam == 1 |
| 50 | + |
| 51 | + # lgamma(1.2) == -0.853740900033158497197e-1, lgamma(1.2) sets signgam to 1 |
| 52 | + y, signgam = labsgamma(T(1.2)) |
| 53 | + # @test_broken y === -0.853740900033158497197e-1 |
| 54 | + if T === Float64 |
| 55 | + @test y ≈ -0.853740900033158497197e-1 atol=2e-17 |
| 56 | + else |
| 57 | + @test y ≈ -0.853740900033158497197e-1 atol=2e-8 |
| 58 | + end |
| 59 | + @test signgam == 1 |
| 60 | + end |
| 61 | +end |
0 commit comments