Skip to content

Commit a719777

Browse files
author
Luis Benet
committed
Add extended_mod(a, y), with tests
1 parent b6f6825 commit a719777

File tree

3 files changed

+79
-9
lines changed

3 files changed

+79
-9
lines changed

src/IntervalArithmetic.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export
5050
RoundTiesToEven, RoundTiesToAway,
5151
cancelminus, cancelplus, isunbounded,
5252
.., @I_str, ±,
53-
pow, extended_div,
53+
pow, extended_div, extended_mod,
5454
setformat, @format
5555

5656
export

src/intervals/functions.jl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,3 +286,33 @@ function mod(a::Interval, y::T) where {T<:Real}
286286
return interval(mod(a.lo, y), mod(a.hi, y))
287287
end
288288
end
289+
290+
291+
function extended_mod(a::Interval, y::T) where {T<:Real}
292+
yy = abs(y)
293+
fld_lo = fld(a.lo, yy)
294+
fld_hi = fld(a.hi, yy)
295+
z = zero(fld_lo)
296+
S = typeof( z )
297+
ee = emptyinterval(S)
298+
299+
if fld_lo + 1 == fld_hi
300+
# `a` includes one discontinuity
301+
if y > 0
302+
return interval(mod(a.lo, y), y), interval(z, mod(a.hi, y)), ee
303+
else
304+
return interval(mod(a.lo, y), z), interval(y, mod(a.hi, y)), ee
305+
end
306+
elseif fld_lo +1 < fld_hi
307+
# `a` includes more discontinuities
308+
if y > 0
309+
return interval(mod(a.lo, y), y), interval(z, y), interval(z, mod(a.hi, y))
310+
else
311+
return interval(mod(a.lo, y), z), interval(y, z), interval(y, mod(a.hi, y))
312+
end
313+
else
314+
# no discontinuity crossed within `a`
315+
return interval(mod(a.lo, y), mod(a.hi, y)), ee, ee
316+
end
317+
318+
end

test/interval_tests/numeric.jl

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -284,26 +284,66 @@ end
284284
@testset "`mod`" begin
285285
r = 0.0625
286286
a = r..(1+r)
287-
@test mod(a, 1) == mod(a, 1.0) == interval(0,1)
287+
@test mod(a, 1) == mod(a, 1.0) == 0..1
288288
@test mod(a, 2) == mod(a, 2.0) == a
289289
@test mod(a, 2.5) == a
290-
@test mod(a, -1) == mod(a, -1.0) == interval(-1,0)
290+
@test mod(a, 0.5) == 0..0.5
291+
@test mod(a, -1) == mod(a, -1.0) == -1..0
291292
@test mod(a, -2) == mod(a, -2.0) == -2+a
292293
@test mod(a, -2.5) == -2.5+a
294+
@test mod(a, -0.5) == -0.5..0
293295

294296
a = (-1+r) .. -r
295297
@test mod(a, 1) == mod(a, 1.0) == 1+a
296298
@test mod(a, 2) == mod(a, 2.0) == 2+a
297299
@test mod(a, 2.5) == 2.5+a
300+
@test mod(a, 0.5) == 0..0.5
298301
@test mod(a, -1) == mod(a, -1.0) == a
299302
@test mod(a, -2) == mod(a, -2.0) == a
300303
@test mod(a, -2.5) == a
304+
@test mod(a, -0.5) == -0.5..0
301305

302306
a = -r .. 1-r
303-
@test mod(a, 1) == mod(a, 1.0) == interval(0,1)
304-
@test mod(a, 2) == mod(a, 2.0) == interval(0,2)
305-
@test mod(a, 2.5) == interval(0,2.5)
306-
@test mod(a, -1) == mod(a, -1.0) == interval(-1,0)
307-
@test mod(a, -2) == mod(a, -2.0) == interval(-2,0)
308-
@test mod(a, -2.5) == interval(-2.5,0)
307+
@test mod(a, 1) == mod(a, 1.0) == 0..1
308+
@test mod(a, 2) == mod(a, 2.0) == 0..2
309+
@test mod(a, 2.5) == 0..2.5
310+
@test mod(a, 0.5) == 0..0.5
311+
@test mod(a, -1) == mod(a, -1.0) == -1..0
312+
@test mod(a, -2) == mod(a, -2.0) == -2..0
313+
@test mod(a, -2.5) == -2.5..0
314+
@test mod(a, -0.5) == -0.5..0
315+
end
316+
317+
@testset "`extended_mod`" begin
318+
r = 0.0625
319+
a = r..(1+r)
320+
ee = emptyinterval(Float64)
321+
@test extended_mod(a, 1) == (r..1, 0..r, ee)
322+
@test extended_mod(a, 2) == (a, ee, ee)
323+
@test extended_mod(a, 2.5) == (a, ee, ee)
324+
@test extended_mod(a, 0.5) == (r..0.5, 0..0.5, 0..r)
325+
@test extended_mod(a, -1) == ((-1+r)..0, -1..(-1+r), ee)
326+
@test extended_mod(a, -2) == ((-2+r)..(-1+r), ee, ee)
327+
@test extended_mod(a, -2.5) == ((-2.5+r)..(-1.5+r), ee, ee)
328+
@test extended_mod(a, -0.5) == ((-0.5+r)..0, -0.5..0, -0.5..(-0.5+r))
329+
330+
a = (-1+r) .. -r
331+
@test extended_mod(a, 1) == (1+a, ee, ee)
332+
@test extended_mod(a, 2) == (2+a, ee, ee)
333+
@test extended_mod(a, 2.5) == (2.5+a, ee, ee)
334+
@test extended_mod(a, 0.5) == (r..0.5, 0..(0.5-r), ee)
335+
@test extended_mod(a, -1) == ((-1+r) .. -r, ee, ee)
336+
@test extended_mod(a, -2) == ((-1+r) .. -r, ee, ee)
337+
@test extended_mod(a, -2.5) == ((-1+r) .. -r, ee, ee)
338+
@test extended_mod(a, -0.5) == ((-0.5+r)..0, -0.5 .. -r, ee)
339+
340+
a = -r .. 1-r
341+
@test extended_mod(a, 1) == ((1-r)..1, 0..(1-r), ee)
342+
@test extended_mod(a, 2) == ((2-r)..2, 0..(1-r), ee)
343+
@test extended_mod(a, 2.5) == ((2.5-r)..2.5, 0..(1-r), ee)
344+
@test extended_mod(a, 0.5) == ((0.5-r)..0.5, 0..0.5, 0..(0.5-r))
345+
@test extended_mod(a, -1) == (-r..0, -1..(-r), ee)
346+
@test extended_mod(a, -2) == (-r..0, -2..(-1-r), ee)
347+
@test extended_mod(a, -2.5) == (-r..0, (-2.5)..(-1.5-r), ee)
348+
@test extended_mod(a, -0.5) == (-r..0, -0.5..0, -0.5..(-r))
309349
end

0 commit comments

Comments
 (0)