Skip to content

Commit b27263a

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

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
@@ -62,7 +62,7 @@ export
6262
RoundTiesToEven, RoundTiesToAway,
6363
cancelminus, cancelplus, isunbounded,
6464
.., @I_str, ±,
65-
pow, extended_div,
65+
pow, extended_div, extended_mod,
6666
setformat, @format
6767

6868
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
@@ -288,26 +288,66 @@ end
288288
@testset "`mod`" begin
289289
r = 0.0625
290290
a = r..(1+r)
291-
@test mod(a, 1) == mod(a, 1.0) == interval(0,1)
291+
@test mod(a, 1) == mod(a, 1.0) == 0..1
292292
@test mod(a, 2) == mod(a, 2.0) == a
293293
@test mod(a, 2.5) == a
294-
@test mod(a, -1) == mod(a, -1.0) == interval(-1,0)
294+
@test mod(a, 0.5) == 0..0.5
295+
@test mod(a, -1) == mod(a, -1.0) == -1..0
295296
@test mod(a, -2) == mod(a, -2.0) == -2+a
296297
@test mod(a, -2.5) == -2.5+a
298+
@test mod(a, -0.5) == -0.5..0
297299

298300
a = (-1+r) .. -r
299301
@test mod(a, 1) == mod(a, 1.0) == 1+a
300302
@test mod(a, 2) == mod(a, 2.0) == 2+a
301303
@test mod(a, 2.5) == 2.5+a
304+
@test mod(a, 0.5) == 0..0.5
302305
@test mod(a, -1) == mod(a, -1.0) == a
303306
@test mod(a, -2) == mod(a, -2.0) == a
304307
@test mod(a, -2.5) == a
308+
@test mod(a, -0.5) == -0.5..0
305309

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

0 commit comments

Comments
 (0)