Skip to content

Commit 2be6ebe

Browse files
authored
feat: sin and cos non-finite (#17)
1 parent 526d2aa commit 2be6ebe

File tree

2 files changed

+51
-11
lines changed

2 files changed

+51
-11
lines changed

lib/complex.ex

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -973,14 +973,19 @@ defmodule Complex do
973973
def sin(n) when is_number(n), do: :math.sin(n)
974974
def sin(n) when is_non_finite_number(n), do: :nan
975975

976-
def sin(%Complex{re: re, im: _}) when is_non_finite_number(re), do: :nan
976+
def sin(%Complex{re: re, im: im}) when is_non_finite_number(re) and is_number(im),
977+
do: Complex.new(:nan, :nan)
977978

978-
def sin(%Complex{re: re, im: im}) when is_number(re) and is_non_finite_number(im),
979-
do:
980-
new(
981-
multiply(:math.sin(re), cosh(im)),
982-
multiply(:math.sin(re), sinh(im))
983-
)
979+
def sin(%Complex{im: :nan}), do: Complex.new(:nan, :nan)
980+
def sin(%Complex{re: :nan}), do: Complex.new(:nan, :nan)
981+
982+
def sin(%Complex{re: re, im: im}) when is_number(re) and is_non_finite_number(im) do
983+
Complex.new(multiply(re, im), im)
984+
end
985+
986+
def sin(%Complex{re: re, im: im}) when is_non_finite_number(re) and is_non_finite_number(im) do
987+
Complex.new(:nan, :nan)
988+
end
984989

985990
def sin(z = %Complex{}) do
986991
new(
@@ -1065,11 +1070,18 @@ defmodule Complex do
10651070

10661071
def cos(n) when is_non_finite_number(n), do: :nan
10671072

1073+
def cos(%Complex{re: re, im: im}) when is_non_finite_number(re) and is_number(im),
1074+
do: Complex.new(:nan, :nan)
1075+
1076+
def cos(%Complex{im: :nan}), do: Complex.new(:nan, :nan)
1077+
def cos(%Complex{re: :nan}), do: Complex.new(:nan, :nan)
1078+
10681079
def cos(%Complex{re: re, im: im}) when is_number(re) and is_non_finite_number(im) do
1069-
new(
1070-
multiply(:math.cos(re), cosh(im)),
1071-
multiply(:math.sin(-re), sinh(im))
1072-
)
1080+
Complex.new(:infinity, -1 |> multiply(im) |> multiply(re))
1081+
end
1082+
1083+
def cos(%Complex{re: re, im: im}) when is_non_finite_number(re) and is_non_finite_number(im) do
1084+
Complex.new(:nan, :nan)
10731085
end
10741086

10751087
def cos(z = %Complex{}) do

test/complex_test.exs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,34 @@ defmodule ComplexTest do
602602
assert_close Complex.acsc(7.086167), :math.pi() - a
603603
end
604604

605+
test "sin (non-finite)" do
606+
assert Complex.sin(Complex.new(:nan)) == Complex.new(:nan, :nan)
607+
assert Complex.sin(Complex.new(:infinity)) == Complex.new(:nan, :nan)
608+
assert Complex.sin(Complex.new(:neg_infinity)) == Complex.new(:nan, :nan)
609+
assert Complex.sin(Complex.new(0, :nan)) == Complex.new(:nan, :nan)
610+
assert Complex.sin(Complex.new(0, :infinity)) == Complex.new(:nan, :infinity)
611+
assert Complex.sin(Complex.new(0, :neg_infinity)) == Complex.new(:nan, :neg_infinity)
612+
613+
assert Complex.sin(Complex.new(-1, :infinity)) == Complex.new(:neg_infinity, :infinity)
614+
assert Complex.sin(Complex.new(1, :infinity)) == Complex.new(:infinity, :infinity)
615+
assert Complex.sin(Complex.new(-1, :neg_infinity)) == Complex.new(:infinity, :neg_infinity)
616+
assert Complex.sin(Complex.new(1, :neg_infinity)) == Complex.new(:neg_infinity, :neg_infinity)
617+
end
618+
619+
test "cos (non-finite)" do
620+
assert Complex.cos(Complex.new(:nan)) == Complex.new(:nan, :nan)
621+
assert Complex.cos(Complex.new(:infinity)) == Complex.new(:nan, :nan)
622+
assert Complex.cos(Complex.new(:neg_infinity)) == Complex.new(:nan, :nan)
623+
assert Complex.cos(Complex.new(0, :nan)) == Complex.new(:nan, :nan)
624+
assert Complex.cos(Complex.new(0, :infinity)) == Complex.new(:infinity, :nan)
625+
assert Complex.cos(Complex.new(0, :neg_infinity)) == Complex.new(:infinity, :nan)
626+
627+
assert Complex.cos(Complex.new(-1, :infinity)) == Complex.new(:infinity, :infinity)
628+
assert Complex.cos(Complex.new(1, :infinity)) == Complex.new(:infinity, :neg_infinity)
629+
assert Complex.cos(Complex.new(-1, :neg_infinity)) == Complex.new(:infinity, :neg_infinity)
630+
assert Complex.cos(Complex.new(1, :neg_infinity)) == Complex.new(:infinity, :infinity)
631+
end
632+
605633
test "Hyperbolic functions" do
606634
a = Complex.new(1.0, 2.0)
607635
assert_close Complex.sinh(a), %Complex{re: -0.48905625904129363, im: 1.4031192506220405}

0 commit comments

Comments
 (0)