Skip to content

Commit f946cfa

Browse files
committed
Add comprehensive edge case tests for elliptic integrals
Add boundary value tests at each polynomial table transition (m = 0.0, 0.1, ..., 0.9) with prevfloat/nextfloat continuity checks. Add negative m transformation tests and special value edge cases (NaN, Inf, -Inf, DomainError).
1 parent 089e285 commit f946cfa

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

test/ellip.jl

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,95 @@
4848
@test_throws DomainError ellipe(1.2)
4949
end
5050
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

Comments
 (0)