|
48 | 48 | @test_throws DomainError ellipe(1.2) |
49 | 49 | end |
50 | 50 | end |
| 51 | + |
| 52 | +@testset "elliptic edge cases" begin |
| 53 | + # Boundary value tests at each polynomial table transition (idx = 0,1,2,...,9) |
| 54 | + # These test the boundaries where the binary tree branching changes paths |
| 55 | + @testset "ellipk boundary values" begin |
| 56 | + # Table boundaries: 0.0, 0.1, 0.2, ..., 0.9, 1.0 |
| 57 | + # Reference values from current implementation (regression test baseline) |
| 58 | + @test ellipk(0.0) ≈ 1.5707963267948966 rtol=2*eps() # π/2 |
| 59 | + @test ellipk(0.1) ≈ 1.6124413487202192 rtol=2*eps() |
| 60 | + @test ellipk(0.2) ≈ 1.6596235986105277 rtol=2*eps() |
| 61 | + @test ellipk(0.3) ≈ 1.7138894481787912 rtol=2*eps() |
| 62 | + @test ellipk(0.4) ≈ 1.7775193714912532 rtol=2*eps() |
| 63 | + @test ellipk(0.5) ≈ 1.8540746773013721 rtol=2*eps() |
| 64 | + @test ellipk(0.6) ≈ 1.9495677498060260 rtol=2*eps() |
| 65 | + @test ellipk(0.7) ≈ 2.0753631352924691 rtol=2*eps() |
| 66 | + @test ellipk(0.8) ≈ 2.2572053268208530 rtol=2*eps() |
| 67 | + @test ellipk(0.85) ≈ 2.3890164863255676 rtol=2*eps() # Table 10-11 boundary |
| 68 | + @test ellipk(0.9) ≈ 2.5780921133481733 rtol=2*eps() |
| 69 | + @test ellipk(0.95) ≈ 2.9083372484445515 rtol=2*eps() |
| 70 | + @test ellipk(0.99) ≈ 3.6956373629898747 rtol=2*eps() |
| 71 | + |
| 72 | + # Near-boundary tests using prevfloat/nextfloat |
| 73 | + @test ellipk(prevfloat(0.1)) ≈ ellipk(0.1) rtol=1e-10 |
| 74 | + @test ellipk(nextfloat(0.1)) ≈ ellipk(0.1) rtol=1e-10 |
| 75 | + @test ellipk(prevfloat(0.5)) ≈ ellipk(0.5) rtol=1e-10 |
| 76 | + @test ellipk(nextfloat(0.5)) ≈ ellipk(0.5) rtol=1e-10 |
| 77 | + @test ellipk(prevfloat(0.9)) ≈ ellipk(0.9) rtol=1e-10 |
| 78 | + @test ellipk(nextfloat(0.9)) ≈ ellipk(0.9) rtol=1e-10 |
| 79 | + end |
| 80 | + |
| 81 | + @testset "ellipe boundary values" begin |
| 82 | + # Table boundaries: 0.0, 0.1, 0.2, ..., 0.9, 1.0 |
| 83 | + # Reference values from current implementation (regression test baseline) |
| 84 | + @test ellipe(0.0) ≈ 1.5707963267948966 rtol=2*eps() # π/2 |
| 85 | + @test ellipe(0.1) ≈ 1.5307576368977631 rtol=2*eps() |
| 86 | + @test ellipe(0.2) ≈ 1.4890350580958527 rtol=2*eps() |
| 87 | + @test ellipe(0.3) ≈ 1.4453630644126654 rtol=2*eps() |
| 88 | + @test ellipe(0.4) ≈ 1.3993921388974322 rtol=2*eps() |
| 89 | + @test ellipe(0.5) ≈ 1.3506438810476753 rtol=2*eps() |
| 90 | + @test ellipe(0.6) ≈ 1.2984280350469133 rtol=2*eps() |
| 91 | + @test ellipe(0.7) ≈ 1.2416705679458224 rtol=2*eps() |
| 92 | + @test ellipe(0.8) ≈ 1.1784899243278386 rtol=2*eps() |
| 93 | + @test ellipe(0.85) ≈ 1.1433957918831656 rtol=2*eps() # Table 10-11 boundary |
| 94 | + @test ellipe(0.9) ≈ 1.1047747327040722 rtol=2*eps() |
| 95 | + @test ellipe(0.95) ≈ 1.0604737277662784 rtol=2*eps() |
| 96 | + @test ellipe(0.99) ≈ 1.0159935450252240 rtol=2*eps() |
| 97 | + |
| 98 | + # Near-boundary tests |
| 99 | + @test ellipe(prevfloat(0.1)) ≈ ellipe(0.1) rtol=1e-10 |
| 100 | + @test ellipe(nextfloat(0.1)) ≈ ellipe(0.1) rtol=1e-10 |
| 101 | + @test ellipe(prevfloat(0.5)) ≈ ellipe(0.5) rtol=1e-10 |
| 102 | + @test ellipe(nextfloat(0.5)) ≈ ellipe(0.5) rtol=1e-10 |
| 103 | + @test ellipe(prevfloat(0.9)) ≈ ellipe(0.9) rtol=1e-10 |
| 104 | + @test ellipe(nextfloat(0.9)) ≈ ellipe(0.9) rtol=1e-10 |
| 105 | + end |
| 106 | + |
| 107 | + @testset "negative m values" begin |
| 108 | + # Negative m uses transformation: x = m/(m-1), K(m) = K(x)/sqrt(1-m) |
| 109 | + # Reference values from current implementation (regression test baseline) |
| 110 | + @test ellipk(-0.1) ≈ 1.5335928197134567 rtol=2*eps() |
| 111 | + @test ellipk(-0.5) ≈ 1.4157372084259563 rtol=2*eps() |
| 112 | + @test ellipk(-1.0) ≈ 1.3110287771460600 rtol=2*eps() |
| 113 | + @test ellipk(-2.0) ≈ 1.1714200841467699 rtol=2*eps() |
| 114 | + @test ellipk(-10.0) ≈ 0.7908718902387385 rtol=2*eps() |
| 115 | + |
| 116 | + @test ellipe(-0.1) ≈ 1.6093590249375296 rtol=2*eps() |
| 117 | + @test ellipe(-0.5) ≈ 1.7517712756948178 rtol=2*eps() |
| 118 | + @test ellipe(-1.0) ≈ 1.9100988945138559 rtol=2*eps() |
| 119 | + @test ellipe(-2.0) ≈ 2.1844381427462012 rtol=2*eps() |
| 120 | + @test ellipe(-10.0) ≈ 3.6391380384177681 rtol=2*eps() |
| 121 | + end |
| 122 | + |
| 123 | + @testset "special edge cases" begin |
| 124 | + # Values very close to 1.0 |
| 125 | + @test ellipk(prevfloat(1.0)) > 10.0 # Should be very large |
| 126 | + @test ellipe(prevfloat(1.0)) ≈ 1.0 rtol=1e-6 # Should be close to 1 |
| 127 | + |
| 128 | + # Very small positive values |
| 129 | + @test ellipk(1e-15) ≈ π/2 rtol=1e-10 |
| 130 | + @test ellipe(1e-15) ≈ π/2 rtol=1e-10 |
| 131 | + |
| 132 | + # Consistency: E(m) ≤ π/2 for m ∈ [0,1] |
| 133 | + for m in 0.0:0.1:1.0 |
| 134 | + @test ellipe(m) <= π/2 + eps() |
| 135 | + end |
| 136 | + |
| 137 | + # Consistency: K(m) ≥ π/2 for m ∈ [0,1) |
| 138 | + for m in 0.0:0.1:0.9 |
| 139 | + @test ellipk(m) >= π/2 - eps() |
| 140 | + end |
| 141 | + end |
| 142 | +end |
0 commit comments