Skip to content

Commit 9ee216c

Browse files
committed
Merge branch 'master' of https://github.com/yashrajgupta/IntervalArithmetic.jl into rsqrt_function_patch
2 parents b6fcc80 + 3314a37 commit 9ee216c

File tree

3 files changed

+71
-1
lines changed

3 files changed

+71
-1
lines changed

src/IntervalArithmetic.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import Base:
2929
convert, promote_rule, eltype, size,
3030
BigFloat, float, widen, big,
3131
, , , , , eps,
32-
floor, ceil, trunc, sign, round,
32+
floor, ceil, trunc, sign, round, copysign, flipsign, signbit,
3333
expm1, log1p,
3434
precision,
3535
isfinite, isnan, isinf, iszero,

src/intervals/arithmetic.jl

+37
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,43 @@ function sign(a::Interval)
354354
return Interval(sign(a.lo), sign(a.hi))
355355
end
356356

357+
"""
358+
signbit(x::Interval)
359+
360+
Returns an interval containing `true` (`1`) if the value of the sign of any element in `x` is negative, containing `false` (`0`)
361+
if any element in `x` is non-negative, and an empy interval if `x` is empty.
362+
363+
# Examples
364+
```jldoctest
365+
julia> signbit(@interval(-4))
366+
[1, 1]
367+
368+
julia> signbit(@interval(5))
369+
[0, 0]
370+
371+
julia> signbit(@interval(-4,5))
372+
[0, 1]
373+
```
374+
"""
375+
function signbit(a::Interval)
376+
isempty(a) && return emptyinterval(a)
377+
return Interval(signbit(a.hi), signbit(a.lo))
378+
end
379+
380+
for Typ in (:Interval, :Real, :Float64, :Float32, :Signed, :Unsigned)
381+
@eval begin
382+
copysign(a::$Typ, b::Interval) = abs(a)*(1-2signbit(b))
383+
flipsign(a::$Typ, b::Interval) = a*(1-2signbit(b))
384+
end
385+
end
386+
387+
for Typ in (:Real, :Float64, :Float32, :Signed, :Unsigned)
388+
@eval begin
389+
copysign(a::Interval, b::$Typ) = abs(a)*(1-2signbit(b))
390+
flipsign(a::Interval, b::$Typ) = a*(1-2signbit(b))
391+
end
392+
end
393+
357394
# RoundTiesToEven is an alias of `RoundNearest`
358395
const RoundTiesToEven = RoundNearest
359396
# RoundTiesToAway is an alias of `RoundNearestTiesAway`

test/interval_tests/numeric.jl

+33
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,39 @@ end
192192
@test ceil(@interval(0.1, 1.1)) == Interval(1, 2)
193193
@test round(@interval(0.1, 1.1), RoundUp) == Interval(1, 2)
194194
@test sign(@interval(0.1, 1.1)) == Interval(1.0)
195+
@test signbit(@interval(-4)) == @interval(1,1)
196+
@test signbit(@interval(5)) == @interval(0,0)
197+
@test signbit(@interval(-4,5)) == @interval(0,1)
198+
@test copysign(@interval(1,2), @interval(-1,1)) == @interval(-2,2)
199+
@test copysign(3, @interval(-1,1)) == @interval(-3,3)
200+
@test copysign(3.0, @interval(-1,1)) == @interval(-3,3)
201+
@test copysign(3f0, @interval(-1,1)) == @interval(-3,3)
202+
@test copysign(3, @interval(0,1)) == @interval(3) == @interval(copysign(3,0),copysign(3,1))
203+
@test copysign(3, @interval(-1,0)) == @interval(-3,3) == @interval(copysign(3,-1),copysign(3,0))
204+
@test copysign(UInt64(3), @interval(-1,1)) == @interval(-3,3)
205+
@test copysign(BigFloat(3), @interval(-1,1)) == @interval(-3,3)
206+
@test copysign(@interval(0,1), -1) == @interval(-1,0)
207+
@test copysign(@interval(0,1), -1.0) == @interval(-1,0)
208+
@test copysign(@interval(0,1), -1f0) == @interval(-1,0)
209+
@test copysign(@interval(0,1), -BigFloat(1)) == @interval(-1,0)
210+
@test copysign(@interval(0,1), UInt64(1)) == @interval(0,1)
211+
@test copysign(@interval(-1),@interval(-1)) == @interval(-1)
212+
@test copysign(@interval(-2,2), 2) == @interval(0,2)
213+
@test flipsign(@interval(1,2), @interval(-1,1)) == @interval(-2,2)
214+
@test flipsign(@interval(1,2), @interval(1,2)) == @interval(1,2)
215+
@test flipsign(3, @interval(-1,1)) == @interval(-3,3)
216+
@test flipsign(3.0, @interval(-1,1)) == @interval(-3,3)
217+
@test flipsign(3f0, @interval(-1,1)) == @interval(-3,3)
218+
@test flipsign(3, @interval(0,1)) == @interval(3,3) == @interval(flipsign(3,0),flipsign(3,1))
219+
@test flipsign(3, @interval(-1,0)) == @interval(-3,3) == @interval(flipsign(3,-1),flipsign(3,0))
220+
@test flipsign(UInt64(3), @interval(-1,1)) == @interval(-3,3)
221+
@test flipsign(BigFloat(3), @interval(-1,1)) == @interval(-3,3)
222+
@test flipsign(@interval(0,1), -1) == @interval(-1,0)
223+
@test flipsign(@interval(0,1), -1.0) == @interval(-1,0)
224+
@test flipsign(@interval(0,1), -1f0) == @interval(-1,0)
225+
@test flipsign(@interval(0,1), -BigFloat(1)) == @interval(-1,0)
226+
@test flipsign(@interval(0,1), UInt64(1)) == @interval(0,1)
227+
@test flipsign(@interval(-1),@interval(-1)) == @interval(1)
195228
@test trunc(@interval(0.1, 1.1)) == Interval(0.0, 1.0)
196229
@test round(@interval(0.1, 1.1), RoundToZero) == Interval(0.0, 1.0)
197230
@test round(@interval(0.1, 1.1)) == Interval(0.0, 1.0)

0 commit comments

Comments
 (0)