Skip to content

Commit 8d6964a

Browse files
committed
Don't divide by an interval spanning 0
1 parent 39f68c2 commit 8d6964a

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

exercise_2.10.exs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
defmodule Interval do
2+
def make(lower, upper), do: [lower | upper]
3+
def lower(interval), do: hd interval
4+
def upper(interval), do: tl interval
5+
6+
def add(x, y), do: make(lower(x) + lower(y), upper(x) + upper(y))
7+
8+
def sub(x, y), do: make(lower(x) - upper(y), upper(x) - lower(y))
9+
10+
def mul(x, y) do
11+
p1 = lower(x) * lower(y)
12+
p2 = lower(x) * upper(y)
13+
p3 = upper(x) * lower(y)
14+
p4 = upper(x) * upper(y)
15+
16+
make Enum.min([p1, p2, p3, p4]), Enum.max([p1, p2, p3, p4])
17+
end
18+
19+
def div(x, y) do
20+
if span_zero?(y) do
21+
raise ArithmeticError, message: "cannot divide by interval spanning zero"
22+
end
23+
mul(x, make(1 / upper(y), 1 / lower(y)))
24+
end
25+
26+
def span_zero?(interval), do: lower(interval) <= 0 && upper(interval) >= 0
27+
end
28+
29+
ExUnit.start
30+
31+
defmodule IntervalTests do
32+
use ExUnit.Case, async: true
33+
34+
test "dividing by zero is an error" do
35+
numer = Interval.make 3, 7
36+
denom = Interval.make -3, 3
37+
assert_raise ArithmeticError, fn -> Interval.div(numer, denom) end
38+
end
39+
end

0 commit comments

Comments
 (0)