Skip to content

Commit 47600df

Browse files
Luis Benetdpsanders
Luis Benet
authored andcommitted
Add extended_mod(a, y), with tests
1 parent f753b3c commit 47600df

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
@@ -45,7 +45,7 @@ export
4545
RoundTiesToEven, RoundTiesToAway,
4646
cancelminus, cancelplus, isunbounded,
4747
.., @I_str, ±,
48-
pow, extended_div,
48+
pow, extended_div, extended_mod,
4949
setformat, @format
5050

5151
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
@@ -282,26 +282,66 @@ end
282282
@testset "`mod`" begin
283283
r = 0.0625
284284
a = r..(1+r)
285-
@test mod(a, 1) == mod(a, 1.0) == interval(0,1)
285+
@test mod(a, 1) == mod(a, 1.0) == 0..1
286286
@test mod(a, 2) == mod(a, 2.0) == a
287287
@test mod(a, 2.5) == a
288-
@test mod(a, -1) == mod(a, -1.0) == interval(-1,0)
288+
@test mod(a, 0.5) == 0..0.5
289+
@test mod(a, -1) == mod(a, -1.0) == -1..0
289290
@test mod(a, -2) == mod(a, -2.0) == -2+a
290291
@test mod(a, -2.5) == -2.5+a
292+
@test mod(a, -0.5) == -0.5..0
291293

292294
a = (-1+r) .. -r
293295
@test mod(a, 1) == mod(a, 1.0) == 1+a
294296
@test mod(a, 2) == mod(a, 2.0) == 2+a
295297
@test mod(a, 2.5) == 2.5+a
298+
@test mod(a, 0.5) == 0..0.5
296299
@test mod(a, -1) == mod(a, -1.0) == a
297300
@test mod(a, -2) == mod(a, -2.0) == a
298301
@test mod(a, -2.5) == a
302+
@test mod(a, -0.5) == -0.5..0
299303

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

0 commit comments

Comments
 (0)