From 60d266abaf14d88cf938ccb34553bed19e4bd793 Mon Sep 17 00:00:00 2001 From: Jiahao Chen Date: Fri, 19 Apr 2013 18:11:47 -0400 Subject: [PATCH 1/5] =?UTF-8?q?Implements=20Kahan's=20versions=20of=20elem?= =?UTF-8?q?entary=20complex=20functions=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …paying particular attention to behavior near branch cuts. Functions: sqrt, ^, log, asin, acos, atan, tanh, asinh, acosh, atanh Includes also the ssqs to compute the mod-squared of a complex number scaled by a power of 2 to avoid overflow/underflow Issues - The ^ function fails tests so is disabled for now. - The log function works only for `Complex{FloatingPoint}`. Explicitly casting `{T<:Integer}Complex{T}` to floating-point `Complex` causes tests to fail. Ref: [Branch cuts for complex elementary functions](http://people.freebsd.org/~das/kahan86branch.pdf) --- base/complex.jl | 171 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 142 insertions(+), 29 deletions(-) diff --git a/base/complex.jl b/base/complex.jl index a3b4c2e4b97e2..01dc03000fc79 100644 --- a/base/complex.jl +++ b/base/complex.jl @@ -174,6 +174,29 @@ function /(a::Real, b::Complex) end end +function sqrt{T<:FloatingPoint}(z::Complex{T}) + ρ,k::Int=ssqs(z) + x,y=reim(z) + if isfinite(x) ρ=ldexp(abs(x),-k)+sqrt(ρ) end + if isodd(k) + k = (k-1)/2 + else + k = k/2-1 + ρ+=ρ + end + ρ=ldexp(sqrt(ρ),k) #sqrt((abs(z)+abs(x))/2) without over/underflow + ξ=ρ + η=y + if ρ != zero(ρ) + if isfinite(η) η=(η/ρ)/2 end + if x<0 + ξ=abs(η) + η=copysign(ρ,y) + end + end + complex(ξ,η) +end + function sqrt(z::Complex) rz = float(real(z)) iz = float(imag(z)) @@ -205,13 +228,44 @@ function cos(z::Complex) complex(cos(r)*cosh(i),-sin(r)*sinh(i)) end +function ssqs{T}(z::Complex{T}) + k::Int=0 + ρ=abs2(z) + x, y=reim(z) + if !isfinite(ρ) && (isinf(x) || isinf(y)) + ρ=convert(T, Inf) + elseif 0<ρ asinh(Ω) #Overflow? + complex(copysign(one(T),ξ), copysign(zero(T),η)) + else + t = tan(η) + β = 1+t^2 #sec(η)^2 + s = sinh(ξ) + ρ = sqrt(1 + s^2) #cosh(ξ) + if isinf(t) + complex(ρ/s,1/t) + else + complex(β*ρ*s,t)/(1+β*s^2) + end + end +end + +function asinh(z::Complex) + w=asin(complex(-imag(z),real(z))) + complex(imag(w),-real(w)) +end + +function acosh(z::Complex) + ξ=asinh(real(sqrt(conj(z-1))*sqrt(z+1))) + η=2atan2(imag(sqrt(z-1)),real(sqrt(z+1))) + complex(ξ, η) +end + +function atanh{T}(z::Complex{T}) + const Ω=prevfloat(typemax(T)) + const θ=sqrt(Ω)/4 + const ρ=1/θ + x=real(z) + y=imag(z) + if x > θ || abs(y) > θ #Prevent overflow + return complex(copysign(pi/2, y), real(1/z)) + elseif x==one(x) + ym=abs(y)+ρ + ξ=log(sqrt(sqrt(4+y^2))/sqrt(ym)) + η=copysign(pi/2+atan(ym/2), y)/2 + else #Normal case + ysq=(abs(y)+ρ)^2 + ξ=log1p(4x/((1-x)^2 + ysq))/4 + η=angle(complex(((1-x)*(1+x)-ysq)/2, y)) + end + complex(ξ, η) end -asinh(z::Complex) = log(z + sqrt(z*z + 1)) -acosh(z::Complex) = log(z + sqrt(z*z - 1)) -atanh(z::Complex) = log(sqrt((1+z)/(1-z))) From 83b1fb9bf4883d677a22f1ac83b1c65df2be7df2 Mon Sep 17 00:00:00 2001 From: Jiahao Chen Date: Fri, 19 Apr 2013 21:25:20 -0400 Subject: [PATCH 2/5] Correctly detects for both underflow and overflow in ssqs Fixes type error in log --- base/complex.jl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/base/complex.jl b/base/complex.jl index 01dc03000fc79..c1fca9959696e 100644 --- a/base/complex.jl +++ b/base/complex.jl @@ -228,13 +228,14 @@ function cos(z::Complex) complex(cos(r)*cosh(i),-sin(r)*sinh(i)) end + function ssqs{T}(z::Complex{T}) k::Int=0 ρ=abs2(z) x, y=reim(z) if !isfinite(ρ) && (isinf(x) || isinf(y)) ρ=convert(T, Inf) - elseif 0<ρ Date: Sat, 20 Apr 2013 23:55:38 -0400 Subject: [PATCH 3/5] Corrects underflow check --- base/complex.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/complex.jl b/base/complex.jl index c1fca9959696e..0a58ead738222 100644 --- a/base/complex.jl +++ b/base/complex.jl @@ -235,7 +235,7 @@ function ssqs{T}(z::Complex{T}) x, y=reim(z) if !isfinite(ρ) && (isinf(x) || isinf(y)) ρ=convert(T, Inf) - elseif isinf(ρ) || (ρ==zero(ρ) && (x!=zero(x) || y!=zero(y)) && ρ Date: Mon, 29 Apr 2013 01:14:23 -0400 Subject: [PATCH 4/5] Adds edge cases for all except atanh, atan Reorders tests --- base/complex.jl | 183 +++++--- test/complex.jl | 1062 +++++++++++++++++++++-------------------------- 2 files changed, 586 insertions(+), 659 deletions(-) diff --git a/base/complex.jl b/base/complex.jl index 0a58ead738222..2640d78ff04d1 100644 --- a/base/complex.jl +++ b/base/complex.jl @@ -219,16 +219,32 @@ end angle(z::Complex) = atan2(imag(z), real(z)) function sin(z::Complex) - r, i = reim(z) - complex(sin(r)*cosh(i), cos(r)*sinh(i)) + zr, zi = reim(z) + if !isfinite(zi) && zr == 0 return complex(zr, zi) end + if isnan(zr) && !isfinite(zi) return complex(zr, zi) end + if !isfinite(zr) && zi == 0 return complex(oftype(zr, NaN), zi) end + if !isfinite(zr) && isfinite(zi) return complex(oftype(zr, NaN), oftype(zi, NaN)) end + if !isfinite(zr) && !isfinite(zi) return complex(zr, oftype(zi, NaN)) end + wr = sin(zr)*cosh(zi) + wi = cos(zr)*sinh(zi) + complex(wr, wi) end function cos(z::Complex) - r, i = reim(z) - complex(cos(r)*cosh(i),-sin(r)*sinh(i)) + zr, zi = reim(z) + if !isfinite(zi) && zr == 0 + return complex(isnan(zi) ? zi : oftype(zi, Inf), + isnan(zi) ? zr : zr*-sign(zi)) end + if !isfinite(zr) && isinf(zi) + return complex(oftype(zr, Inf), oftype(zi, NaN)) end + if isinf(zr) + return complex(oftype(zr, NaN), zi==0 ? -copysign(zi, zr) : oftype(zi, NaN)) end + if isnan(zr) && zi==0 return complex(zr, abs(zi)) end + wr = cos(zr)*cosh(zi) + wi = -sin(zr)*sinh(zi) + complex(wr, wi) end - function ssqs{T}(z::Complex{T}) k::Int=0 ρ=abs2(z) @@ -236,7 +252,8 @@ function ssqs{T}(z::Complex{T}) if !isfinite(ρ) && (isinf(x) || isinf(y)) ρ=convert(T, Inf) elseif isinf(ρ) || (ρ==zero(ρ) && (x!=zero(x) || y!=zero(y))) || ρ asinh(Ω) #Overflow? - complex(copysign(one(T),ξ), copysign(zero(T),η)) + complex(copysign(one(T),ξ), copysign(zero(T),η*(isfinite(η) ? sin(2*abs(η)) : 1))) else t = tan(η) β = 1+t^2 #sec(η)^2 @@ -427,8 +474,20 @@ function asinh(z::Complex) end function acosh(z::Complex) + zr, zi=reim(z) + if isnan(zr) || isnan(zi) + if isinf(zr) || isinf(zi) + return complex(oftype(zr, Inf), oftype(zi, NaN)) + else + return complex(oftype(zr, NaN), oftype(zi, NaN)) + end + elseif zr==-Inf && zi===-0.0 #Edge case is wrong - WHY? + return complex(Inf, -pi) + end ξ=asinh(real(sqrt(conj(z-1))*sqrt(z+1))) η=2atan2(imag(sqrt(z-1)),real(sqrt(z+1))) + if isinf(zr) && isinf(zi) + η -= pi/4 * sign(zi) * sign(zr) end complex(ξ, η) end diff --git a/test/complex.jl b/test/complex.jl index e6175c26bc68e..0bf7616387bb2 100644 --- a/test/complex.jl +++ b/test/complex.jl @@ -1,210 +1,169 @@ # sqrt: # tests special values from csqrt man page # as well as conj(sqrt(z)) = sqrt(conj(z)) -@test isequal(sqrt(complex(0.0,0.0)), complex(0.0,0.0)) -@test isequal(sqrt(complex(-0.0,0.0)), complex(0.0,0.0)) -@test isequal(sqrt(complex(0.0,-0.0)), complex(0.0,-0.0)) -@test isequal(sqrt(complex(-0.0,-0.0)), complex(0.0,-0.0)) - -@test isequal(sqrt(complex(5.0,0.0)), complex(sqrt(5.0),0.0)) -@test isequal(sqrt(complex(5.0,-0.0)), complex(sqrt(5.0),-0.0)) - -@test isequal(sqrt(complex(-5.0,0.0)), complex(0.0,sqrt(5.0))) -@test isequal(sqrt(complex(-5.0,-0.0)), complex(0.0,-sqrt(5.0))) - -@test isequal(sqrt(complex(0.0,Inf)), complex(Inf,Inf)) -@test isequal(sqrt(complex(0.0,-Inf)), complex(Inf,-Inf)) - -@test isequal(sqrt(complex(NaN,Inf)), complex(Inf,Inf)) -@test isequal(sqrt(complex(NaN,-Inf)), complex(Inf,-Inf)) - -@test isequal(sqrt(complex(Inf,Inf)), complex(Inf,Inf)) -@test isequal(sqrt(complex(Inf,-Inf)), complex(Inf,-Inf)) -@test isequal(sqrt(complex(-Inf,Inf)), complex(Inf,Inf)) -@test isequal(sqrt(complex(-Inf,-Inf)), complex(Inf,-Inf)) - -@test isequal(sqrt(complex(0.0,NaN)), complex(NaN,NaN)) - -@test isequal(sqrt(complex(-Inf,0.0)), complex(0.0,Inf)) -@test isequal(sqrt(complex(-Inf,5.0)), complex(0.0,Inf)) -@test isequal(sqrt(complex(-Inf,-0.0)), complex(0.0,-Inf)) -@test isequal(sqrt(complex(-Inf,-5.0)), complex(0.0,-Inf)) - -@test isequal(sqrt(complex(Inf,0.0)), complex(Inf,0.0)) -@test isequal(sqrt(complex(Inf,5.0)), complex(Inf,0.0)) -@test isequal(sqrt(complex(Inf,-0.0)), complex(Inf,-0.0)) -@test isequal(sqrt(complex(Inf,-5.0)), complex(Inf,-0.0)) - -@test isequal(sqrt(complex(-Inf,NaN)), complex(NaN,Inf)) -@test isequal(sqrt(complex(Inf,NaN)), complex(Inf,NaN)) - -@test isequal(sqrt(complex(NaN,0.0)), complex(NaN,NaN)) -@test isequal(sqrt(complex(NaN,0.0)), complex(NaN,NaN)) - - +@test isequal(sqrt(complex( 0.0, 0.0)), complex( 0.0, 0.0)) +@test isequal(sqrt(complex( 0.0,-0.0)), complex( 0.0,-0.0)) +@test isequal(sqrt(complex( 0.0, Inf)), complex( Inf, Inf)) +@test isequal(sqrt(complex( 0.0,-Inf)), complex( Inf,-Inf)) +@test isequal(sqrt(complex( 0.0, NaN)), complex( NaN, NaN)) +@test isequal(sqrt(complex(-0.0, 0.0)), complex( 0.0, 0.0)) +@test isequal(sqrt(complex(-0.0,-0.0)), complex( 0.0,-0.0)) + +@test isequal(sqrt(complex( 5.0, 0.0)), complex(sqrt(5.0), 0.0)) +@test isequal(sqrt(complex( 5.0,-0.0)), complex(sqrt(5.0),-0.0)) +@test isequal(sqrt(complex(-5.0, 0.0)), complex( 0.0, sqrt(5.0))) +@test isequal(sqrt(complex(-5.0,-0.0)), complex( 0.0,-sqrt(5.0))) + +@test isequal(sqrt(complex( Inf, 0.0)), complex( Inf, 0.0)) +@test isequal(sqrt(complex( Inf,-0.0)), complex( Inf,-0.0)) +@test isequal(sqrt(complex( Inf, 5.0)), complex( Inf, 0.0)) +@test isequal(sqrt(complex( Inf,-5.0)), complex( Inf,-0.0)) +@test isequal(sqrt(complex( Inf, Inf)), complex( Inf, Inf)) +@test isequal(sqrt(complex( Inf,-Inf)), complex( Inf,-Inf)) +@test isequal(sqrt(complex( Inf, NaN)), complex( Inf, NaN)) + +@test isequal(sqrt(complex(-Inf, 0.0)), complex( 0.0, Inf)) +@test isequal(sqrt(complex(-Inf,-0.0)), complex( 0.0,-Inf)) +@test isequal(sqrt(complex(-Inf, 5.0)), complex( 0.0, Inf)) +@test isequal(sqrt(complex(-Inf,-5.0)), complex( 0.0,-Inf)) +@test isequal(sqrt(complex(-Inf, Inf)), complex( Inf, Inf)) +@test isequal(sqrt(complex(-Inf,-Inf)), complex( Inf,-Inf)) +@test isequal(sqrt(complex(-Inf, NaN)), complex( NaN, Inf)) + +@test isequal(sqrt(complex( NaN, 0.0)), complex( NaN, NaN)) +@test isequal(sqrt(complex( NaN, 0.0)), complex( NaN, NaN)) +@test isequal(sqrt(complex( NaN, Inf)), complex( Inf, Inf)) +@test isequal(sqrt(complex( NaN,-Inf)), complex( Inf,-Inf)) # log: # log(conj(z)) = conj(log(z)) -@test isequal(log(complex(5.0,0.0)),complex(log(5.0),0.0)) -@test isequal(log(complex(5.0,-0.0)),complex(log(5.0),-0.0)) - -@test isequal(log(complex(0.0,1.0)),complex(0.0,pi/2)) -@test isequal(log(complex(0.0,-1.0)),complex(0.0,-pi/2)) - -# special values -# raise divide-by-zero flag -@test isequal(log(complex(-0.0,0.0)), complex(-Inf,pi)) +@test isequal(log(complex( 0.0, 0.0)), complex(-Inf, 0.0)) +@test isequal(log(complex( 0.0,-0.0)), complex(-Inf,-0.0)) +@test isequal(log(complex( 0.0, 1.0)), complex( 0.0, pi/2)) +@test isequal(log(complex( 0.0,-1.0)), complex( 0.0,-pi/2)) +@test isequal(log(complex( 0.0, Inf)), complex( Inf, pi/2)) +@test isequal(log(complex( 0.0,-Inf)), complex( Inf,-pi/2)) +@test isequal(log(complex( 0.0, NaN)), complex( NaN, NaN)) +@test isequal(log(complex(-0.0, 0.0)), complex(-Inf, pi)) @test isequal(log(complex(-0.0,-0.0)), complex(-Inf,-pi)) -# raise divide-by-zero flag -@test isequal(log(complex(0.0,0.0)), complex(-Inf,0.0)) -@test isequal(log(complex(0.0,-0.0)), complex(-Inf,-0.0)) - -@test isequal(log(complex(0.0,Inf)), complex(Inf,pi/2)) -@test isequal(log(complex(0.0,-Inf)), complex(Inf,-pi/2)) - -@test isequal(log(complex(0.0,NaN)), complex(NaN,NaN)) - -@test isequal(log(complex(-Inf,5.0)), complex(Inf,pi)) -@test isequal(log(complex(-Inf,-5.0)), complex(Inf,-pi)) +@test isequal(log(complex( 5.0, 0.0)),complex(log(5.0), 0.0)) +@test isequal(log(complex( 5.0,-0.0)),complex(log(5.0),-0.0)) -@test isequal(log(complex(Inf,5.0)), complex(Inf,0.0)) -@test isequal(log(complex(Inf,-5.0)), complex(Inf,-0.0)) +@test isequal(log(complex( Inf, 5.0)), complex( Inf, 0.0)) +@test isequal(log(complex( Inf,-5.0)), complex( Inf,-0.0)) +@test isequal(log(complex( Inf, Inf)), complex( Inf, pi/4)) +@test isequal(log(complex( Inf,-Inf)), complex( Inf,-pi/4)) +@test isequal(log(complex( Inf, NaN)), complex( Inf, NaN)) -@test isequal(log(complex(-Inf,Inf)), complex(Inf,3*pi/4)) -@test isequal(log(complex(-Inf,-Inf)), complex(Inf,-3*pi/4)) +@test isequal(log(complex(-Inf, 5.0)), complex( Inf, pi)) +@test isequal(log(complex(-Inf,-5.0)), complex( Inf,-pi)) +@test isequal(log(complex(-Inf, Inf)), complex( Inf, 3*pi/4)) +@test isequal(log(complex(-Inf,-Inf)), complex( Inf,-3*pi/4)) +@test isequal(log(complex(-Inf, NaN)), complex( Inf, NaN)) -@test isequal(log(complex(Inf,Inf)), complex(Inf,pi/4)) -@test isequal(log(complex(Inf,-Inf)), complex(Inf,-pi/4)) - -@test isequal(log(complex(Inf,NaN)), complex(Inf,NaN)) -@test isequal(log(complex(-Inf,NaN)), complex(Inf,NaN)) - -@test isequal(log(complex(NaN,0.0)), complex(NaN,NaN)) - -@test isequal(log(complex(NaN,Inf)), complex(Inf,NaN)) -@test isequal(log(complex(NaN,-Inf)), complex(Inf,NaN)) - -@test isequal(log(complex(NaN,NaN)), complex(NaN,NaN)) +@test isequal(log(complex( NaN, 0.0)), complex( NaN, NaN)) +@test isequal(log(complex( NaN, Inf)), complex( Inf, NaN)) +@test isequal(log(complex( NaN,-Inf)), complex( Inf, NaN)) +@test isequal(log(complex( NaN, NaN)), complex( NaN, NaN)) # exp: # exp(conj(z)) = conj(exp(z)) -@test isequal(exp(complex(0.0,0.0)), complex(1.0,0.0)) -@test isequal(exp(complex(0.0,-0.0)), complex(1.0,-0.0)) -@test isequal(exp(complex(-0.0,0.0)), complex(1.0,0.0)) -@test isequal(exp(complex(-0.0,-0.0)), complex(1.0,-0.0)) +@test isequal(exp(complex( 0.0, 0.0)), complex(1.0, 0.0)) +@test isequal(exp(complex( 0.0,-0.0)), complex(1.0,-0.0)) +@test isequal(exp(complex( 0.0, Inf)), complex(NaN, NaN)) +@test isequal(exp(complex( 0.0,-Inf)), complex(NaN, NaN)) +@test isequal(exp(complex( 0.0, NaN)), complex(NaN, NaN)) -# raise invalid flag -@test_fails exp(complex(0.0,Inf)) #complex(NaN,NaN) -@test_fails exp(complex(0.0,-Inf)) #complex(NaN,NaN) -@test_fails exp(complex(5.0,Inf)) #complex(NaN,NaN) +@test isequal(exp(complex(-0.0, 0.0)), complex(1.0, 0.0)) +@test isequal(exp(complex(-0.0,-0.0)), complex(1.0,-0.0)) -@test isequal(exp(complex(0.0,NaN)), complex(NaN,NaN)) +@test isequal(exp(complex( 5.0, Inf)), complex(NaN, NaN)) -@test isequal(exp(complex(Inf,0.0)), complex(Inf,0.0)) -@test isequal(exp(complex(Inf,-0.0)), complex(Inf,-0.0)) +@test isequal(exp(complex( Inf, 0.0)), complex(Inf, 0.0)) +@test isequal(exp(complex( Inf,-0.0)), complex(Inf,-0.0)) +@test isequal(exp(complex( Inf, 5.0)), complex(cos(5.0)*Inf,sin(5.0)* Inf)) +@test isequal(exp(complex( Inf,-5.0)), complex(cos(5.0)*Inf,sin(5.0)*-Inf)) +@test isequal(exp(complex( Inf, NaN)), complex(-Inf, NaN)) +@test isequal(exp(complex( Inf, Inf)), complex(-Inf, NaN)) +@test isequal(exp(complex( Inf,-Inf)), complex(-Inf, NaN)) -@test isequal(exp(complex(-Inf,0.0)), complex(0.0,0.0)) +@test isequal(exp(complex(-Inf, 0.0)), complex(0.0, 0.0)) @test isequal(exp(complex(-Inf,-0.0)), complex(0.0,-0.0)) -@test isequal(exp(complex(-Inf,5.0)), complex(cos(5.0)*0.0,sin(5.0)*0.0)) +@test isequal(exp(complex(-Inf, 5.0)), complex(cos(5.0)*0.0,sin(5.0)* 0.0)) @test isequal(exp(complex(-Inf,-5.0)), complex(cos(5.0)*0.0,sin(5.0)*-0.0)) - -@test isequal(exp(complex(Inf,5.0)), complex(cos(5.0)*Inf,sin(5.0)*Inf)) -@test isequal(exp(complex(Inf,-5.0)), complex(cos(5.0)*Inf,sin(5.0)*-Inf)) - -@test isequal(exp(complex(-Inf,Inf)), complex(-0.0,0.0)) +@test isequal(exp(complex(-Inf, Inf)), complex(-0.0, 0.0)) @test isequal(exp(complex(-Inf,-Inf)), complex(-0.0,-0.0)) +@test isequal(exp(complex(-Inf, NaN)), complex(-0.0, 0.0)) -# raise invalid flag -@test_fails exp(complex(Inf,Inf)) #complex(-Inf,NaN) -@test_fails exp(complex(Inf,-Inf)) #complex(-Inf,NaN) - -@test isequal(exp(complex(-Inf,NaN)), complex(-0.0,0.0)) - -@test isequal(exp(complex(Inf,NaN)), complex(-Inf,NaN)) - -@test isequal(exp(complex(NaN,0.0)), complex(NaN,0.0)) -@test isequal(exp(complex(NaN,-0.0)), complex(NaN,-0.0)) - -@test isequal(exp(complex(NaN,5.0)), complex(NaN,NaN)) - -@test isequal(exp(complex(NaN,NaN)), complex(NaN,NaN)) +@test isequal(exp(complex( NaN, 0.0)), complex( NaN, 0.0)) +@test isequal(exp(complex( NaN,-0.0)), complex( NaN,-0.0)) +@test isequal(exp(complex( NaN, 5.0)), complex( NaN, NaN)) +@test isequal(exp(complex( NaN, NaN)), complex( NaN, NaN)) # ^ (cpow) # equivalent to exp(y*log(x)) # except for 0^0? # conj(x)^conj(y) = conj(x^y) -@test isequal(complex(0.0,0.0)^complex(0.0,0.0), complex(1.0,0.0)) -@test isequal(complex(0.0,0.0)^complex(0.0,-0.0), complex(1.0,0.0)) -@test isequal(complex(0.0,0.0)^complex(-0.0,0.0), complex(1.0,-0.0)) -@test isequal(complex(0.0,0.0)^complex(-0.0,-0.0), complex(1.0,-0.0)) - -@test isequal(complex(0.0,-0.0)^complex(0.0,0.0), complex(1.0,-0.0)) -@test isequal(complex(0.0,-0.0)^complex(0.0,-0.0), complex(1.0,-0.0)) -@test isequal(complex(0.0,-0.0)^complex(-0.0,0.0), complex(1.0,0.0)) -@test isequal(complex(0.0,-0.0)^complex(-0.0,-0.0), complex(1.0,0.0)) - -@test isequal(complex(-0.0,0.0)^complex(0.0,0.0), complex(1.0,0.0)) -@test isequal(complex(-0.0,0.0)^complex(0.0,-0.0), complex(1.0,0.0)) -@test isequal(complex(-0.0,0.0)^complex(-0.0,0.0), complex(1.0,-0.0)) -@test isequal(complex(-0.0,0.0)^complex(-0.0,-0.0), complex(1.0,-0.0)) - -@test isequal(complex(-0.0,-0.0)^complex(0.0,0.0), complex(1.0,-0.0)) -@test isequal(complex(-0.0,-0.0)^complex(0.0,-0.0), complex(1.0,-0.0)) -@test isequal(complex(-0.0,-0.0)^complex(-0.0,0.0), complex(1.0,0.0)) -@test isequal(complex(-0.0,-0.0)^complex(-0.0,-0.0), complex(1.0,0.0)) - +@test isequal(complex( 0.0, 0.0)^complex( 0.0, 0.0), complex(1.0, 0.0)) +@test isequal(complex( 0.0, 0.0)^complex( 0.0,-0.0), complex(1.0, 0.0)) +@test isequal(complex( 0.0, 0.0)^complex(-0.0, 0.0), complex(1.0,-0.0)) +@test isequal(complex( 0.0, 0.0)^complex(-0.0,-0.0), complex(1.0,-0.0)) + +@test isequal(complex( 0.0,-0.0)^complex( 0.0, 0.0), complex(1.0,-0.0)) +@test isequal(complex( 0.0,-0.0)^complex( 0.0,-0.0), complex(1.0,-0.0)) +@test isequal(complex( 0.0,-0.0)^complex(-0.0, 0.0), complex(1.0, 0.0)) +@test isequal(complex( 0.0,-0.0)^complex(-0.0,-0.0), complex(1.0, 0.0)) + +@test isequal(complex(-0.0, 0.0)^complex( 0.0, 0.0), complex(1.0, 0.0)) +@test isequal(complex(-0.0, 0.0)^complex( 0.0,-0.0), complex(1.0, 0.0)) +@test isequal(complex(-0.0, 0.0)^complex(-0.0, 0.0), complex(1.0,-0.0)) +@test isequal(complex(-0.0, 0.0)^complex(-0.0,-0.0), complex(1.0,-0.0)) + +@test isequal(complex(-0.0,-0.0)^complex( 0.0, 0.0), complex(1.0,-0.0)) +@test isequal(complex(-0.0,-0.0)^complex( 0.0,-0.0), complex(1.0,-0.0)) +@test isequal(complex(-0.0,-0.0)^complex(-0.0, 0.0), complex(1.0, 0.0)) +@test isequal(complex(-0.0,-0.0)^complex(-0.0,-0.0), complex(1.0, 0.0)) # sinh: has properties # sinh(conj(z)) = conj(sinh(z)) # sinh(-z) = -sinh(z) -@test isequal(sinh(complex(0.0,0.0)),complex(0.0,0.0)) -@test isequal(sinh(complex(0.0,-0.0)),complex(0.0,-0.0)) -@test isequal(sinh(complex(-0.0,0.0)),complex(-0.0,0.0)) -@test isequal(sinh(complex(-0.0,-0.0)),complex(-0.0,-0.0)) - -# raise invalid flag -@test_fails sinh(complex(0.0,Inf)) #complex(0.0,NaN) -@test_fails sinh(complex(0.0,-Inf)) #complex(0.0,NaN) -@test_fails sinh(complex(-0.0,Inf)) #complex(-0.0,NaN) -@test_fails sinh(complex(-0.0,-Inf)) #complex(-0.0,NaN) - -@test isequal(sinh(complex(0.0,NaN)),complex(0.0,NaN)) -@test isequal(sinh(complex(-0.0,NaN)),complex(-0.0,NaN)) - -# raise invalid flag -@test_fails sinh(complex(5.0,Inf)) #complex(NaN,NaN) - -@test isequal(sinh(complex(5.0,NaN)),complex(NaN,NaN)) - -@test isequal(sinh(complex(Inf,0.0)),complex(Inf,0.0)) -@test isequal(sinh(complex(Inf,-0.0)),complex(Inf,-0.0)) -@test isequal(sinh(complex(-Inf,0.0)),complex(-Inf,0.0)) -@test isequal(sinh(complex(-Inf,-0.0)),complex(-Inf,-0.0)) - -@test isequal(sinh(complex(Inf,5.0)),complex(cos(5.0)*Inf,sin(5.0)*Inf)) -@test isequal(sinh(complex(-Inf,5.0)),complex(cos(5.0)*-Inf,sin(5.0)*Inf)) - -# raise invalid flag -@test_fails sinh(complex(Inf,Inf)) #complex(Inf,NaN) -@test_fails sinh(complex(Inf,-Inf)) #complex(Inf,NaN) -@test_fails sinh(complex(-Inf,Inf)) #complex(-Inf,NaN) -@test_fails sinh(complex(-Inf,-Inf)) #complex(-Inf,NaN) - -@test isequal(sinh(complex(Inf,NaN)),complex(Inf,NaN)) -@test isequal(sinh(complex(-Inf,NaN)),complex(-Inf,NaN)) - -@test isequal(sinh(complex(NaN,0.0)),complex(NaN,0.0)) -@test isequal(sinh(complex(NaN,-0.0)),complex(NaN,-0.0)) - -@test isequal(sinh(complex(NaN,5.0)),complex(NaN,NaN)) - -@test isequal(sinh(complex(NaN,NaN)),complex(NaN,NaN)) - - +@test isequal(sinh(complex( 0.0, 0.0)), complex( 0.0, 0.0)) +@test isequal(sinh(complex( 0.0,-0.0)), complex( 0.0,-0.0)) +@test isequal(sinh(complex( 0.0, Inf)), complex( 0.0, NaN)) +@test isequal(sinh(complex( 0.0,-Inf)), complex( 0.0, NaN)) +@test isequal(sinh(complex( 0.0, NaN)), complex( 0.0, NaN)) + +@test isequal(sinh(complex(-0.0, 0.0)), complex(-0.0, 0.0)) +@test isequal(sinh(complex(-0.0,-0.0)), complex(-0.0,-0.0)) +@test isequal(sinh(complex(-0.0, Inf)), complex(-0.0, NaN)) +@test isequal(sinh(complex(-0.0,-Inf)), complex(-0.0, NaN)) +@test isequal(sinh(complex(-0.0, NaN)), complex(-0.0, NaN)) + +@test isequal(sinh(complex( 5.0, Inf)), complex( NaN, NaN)) +@test isequal(sinh(complex( 5.0, NaN)), complex( NaN, NaN)) + +@test isequal(sinh(complex( Inf, 0.0)), complex( Inf, 0.0)) +@test isequal(sinh(complex( Inf,-0.0)), complex( Inf,-0.0)) +@test isequal(sinh(complex( Inf, 5.0)), complex(cos(5.0)*Inf,sin(5.0)*Inf)) +@test isequal(sinh(complex( Inf, Inf)), complex( Inf, NaN)) +@test isequal(sinh(complex( Inf,-Inf)), complex( Inf, NaN)) +@test isequal(sinh(complex( Inf, NaN)), complex( Inf, NaN)) + +@test isequal(sinh(complex(-Inf, 0.0)), complex(-Inf, 0.0)) +@test isequal(sinh(complex(-Inf,-0.0)), complex(-Inf,-0.0)) +@test isequal(sinh(complex(-Inf, 5.0)), complex(cos(5.0)*-Inf,sin(5.0)*Inf)) +@test isequal(sinh(complex(-Inf, Inf)), complex(-Inf, NaN)) +@test isequal(sinh(complex(-Inf,-Inf)), complex(-Inf, NaN)) +@test isequal(sinh(complex(-Inf, NaN)), complex(-Inf, NaN)) + +@test isequal(sinh(complex( NaN, 0.0)), complex( NaN, 0.0)) +@test isequal(sinh(complex( NaN,-0.0)), complex( NaN,-0.0)) +@test isequal(sinh(complex( NaN, 5.0)), complex( NaN, NaN)) +@test isequal(sinh(complex( NaN, NaN)), complex( NaN, NaN)) # sin: defined in terms of sinh # sin(z) = -i*sinh(i*z) @@ -213,103 +172,79 @@ # sin(conj(z)) = conj(sin(z)) # sin(-z) = -sin(z) +@test isequal(sin(complex( 0.0,-0.0)),complex( 0.0,-0.0)) +@test isequal(sin(complex( 0.0, 0.0)),complex( 0.0, 0.0)) +@test isequal(sin(complex( 0.0, Inf)),complex( 0.0, Inf)) +@test isequal(sin(complex( 0.0,-Inf)),complex( 0.0,-Inf)) +@test isequal(sin(complex( 0.0, NaN)),complex( 0.0, NaN)) -@test isequal(sin(complex(0.0,-0.0)),complex(0.0,-0.0)) +@test isequal(sin(complex(-0.0, 0.0)),complex(-0.0, 0.0)) @test isequal(sin(complex(-0.0,-0.0)),complex(-0.0,-0.0)) -@test isequal(sin(complex(0.0,0.0)),complex(0.0,0.0)) -@test isequal(sin(complex(-0.0,0.0)),complex(-0.0,0.0)) - -# raise invalid flag -@test_fails sin(complex(Inf,0.0)) #complex(NaN,0.0) -@test_fails sin(complex(-Inf,0.0)) #complex(NaN,0.0) -@test_fails sin(complex(Inf,-0.0)) #complex(NaN,-0.0) -@test_fails sin(complex(-Inf,-0.0)) #complex(NaN,-0.0) - -@test isequal(sin(complex(NaN,0.0)),complex(NaN,0.0)) -@test isequal(sin(complex(NaN,-0.0)),complex(NaN,-0.0)) - -# raise invalid flag -@test_fails sin(complex(Inf,5.0)) #complex(NaN,NaN) - -@test isequal(sin(complex(NaN,5.0)),complex(NaN,NaN)) - -@test isequal(sin(complex(0.0,Inf)),complex(0.0,Inf)) -@test isequal(sin(complex(-0.0,Inf)),complex(-0.0,Inf)) -@test isequal(sin(complex(0.0,-Inf)),complex(0.0,-Inf)) +@test isequal(sin(complex(-0.0, Inf)),complex(-0.0, Inf)) @test isequal(sin(complex(-0.0,-Inf)),complex(-0.0,-Inf)) - -@test isequal(sin(complex(5.0,Inf)),complex(sin(5.0)*Inf,cos(5.0)*Inf)) -@test isequal(sin(complex(5.0,-Inf)),complex(sin(5.0)*Inf,cos(5.0)*-Inf)) - -# raise invalid flag -@test_fails sin(complex(Inf,Inf)) #complex(Inf,NaN) -@test_fails sin(complex(Inf,-Inf)) #complex(Inf,NaN) -@test_fails sin(complex(-Inf,Inf)) #complex(-Inf,NaN) -@test_fails sin(complex(-Inf,-Inf)) #complex(-Inf,NaN) - -@test isequal(sin(complex(NaN,Inf)),complex(NaN,Inf)) -@test isequal(sin(complex(NaN,-Inf)),complex(NaN,-Inf)) - -@test isequal(sin(complex(0.0,NaN)),complex(0.0,NaN)) -@test isequal(sin(complex(-0.0,NaN)),complex(-0.0,NaN)) - -@test isequal(sin(complex(5.0,NaN)),complex(NaN,NaN)) - -@test isequal(sin(complex(NaN,NaN)),complex(NaN,NaN)) - - - - - +@test isequal(sin(complex(-0.0, NaN)),complex(-0.0, NaN)) + +@test isequal(sin(complex( 5.0, Inf)),complex(sin(5.0)*Inf,cos(5.0)* Inf)) +@test isequal(sin(complex( 5.0,-Inf)),complex(sin(5.0)*Inf,cos(5.0)*-Inf)) +@test isequal(sin(complex( 5.0, NaN)),complex( NaN, NaN)) + +@test isequal(sin(complex( Inf, 0.0)), complex( NaN, 0.0)) +@test isequal(sin(complex( Inf,-0.0)), complex( NaN,-0.0)) +@test isequal(sin(complex( Inf, 5.0)), complex( NaN, NaN)) +@test isequal(sin(complex( Inf, Inf)), complex( Inf, NaN)) +@test isequal(sin(complex( Inf,-Inf)), complex( Inf, NaN)) + +@test isequal(sin(complex(-Inf, 0.0)), complex( NaN, 0.0)) +@test isequal(sin(complex(-Inf,-0.0)), complex( NaN,-0.0)) +@test isequal(sin(complex(-Inf, 5.0)), complex( NaN, NaN)) +@test isequal(sin(complex(-Inf, Inf)), complex(-Inf, NaN)) +@test isequal(sin(complex(-Inf,-Inf)), complex(-Inf, NaN)) + +@test isequal(sin(complex( NaN, 0.0)),complex( NaN, 0.0)) +@test isequal(sin(complex( NaN,-0.0)),complex( NaN,-0.0)) +@test isequal(sin(complex( NaN, 5.0)),complex( NaN, NaN)) +@test isequal(sin(complex( NaN, Inf)),complex( NaN, Inf)) +@test isequal(sin(complex( NaN,-Inf)),complex( NaN,-Inf)) +@test isequal(sin(complex( NaN, NaN)),complex( NaN, NaN)) # cosh: has properties # cosh(conj(z)) = conj(cosh(z)) # coshh(-z) = cosh(z) -@test isequal(cosh(complex(0.0,0.0)),complex(1.0,0.0)) -@test isequal(cosh(complex(0.0,-0.0)),complex(1.0,-0.0)) -@test isequal(cosh(complex(-0.0,-0.0)),complex(1.0,0.0)) -@test isequal(cosh(complex(-0.0,0.0)),complex(1.0,-0.0)) - -# raise invalid flag -@test_fails cosh(complex(0.0,Inf)) #complex(NaN,0.0) -@test_fails cosh(complex(0.0,-Inf)) #complex(NaN,-0.0) - -@test isequal(cosh(complex(0.0,NaN)),complex(NaN,0.0)) -@test isequal(cosh(complex(-0.0,NaN)),complex(NaN,0.0)) - -# raise invalid flag -@test_fails cosh(complex(5.0,Inf)) #complex(NaN,NaN) - -@test isequal(cosh(complex(5.0,NaN)),complex(NaN,NaN)) - -@test isequal(cosh(complex(Inf,0.0)),complex(Inf,0.0)) -@test isequal(cosh(complex(Inf,-0.0)),complex(Inf,-0.0)) -@test isequal(cosh(complex(-Inf,-0.0)),complex(Inf,0.0)) -@test isequal(cosh(complex(-Inf,0.0)),complex(Inf,-0.0)) - -@test isequal(cosh(complex(Inf,5.0)),complex(cos(5.0)*Inf,sin(5.0)*Inf)) -@test isequal(cosh(complex(Inf,-5.0)),complex(cos(5.0)*Inf,sin(5.0)*-Inf)) -@test isequal(cosh(complex(-Inf,-5.0)),complex(cos(5.0)*Inf,sin(5.0)*Inf)) -@test isequal(cosh(complex(-Inf,5.0)),complex(cos(5.0)*Inf,sin(5.0)*-Inf)) - -# raise invalid flag -@test_fails cosh(complex(Inf,Inf)) #complex(Inf,NaN) -@test_fails cosh(complex(Inf,-Inf)) #complex(Inf,NaN) -@test_fails cosh(complex(-Inf,-Inf)) #complex(Inf,NaN) -@test_fails cosh(complex(-Inf,Inf)) #complex(Inf,NaN) - -@test isequal(cosh(complex(Inf,NaN)),complex(Inf,NaN)) -@test isequal(cosh(complex(-Inf,NaN)),complex(Inf,NaN)) - -@test isequal(cosh(complex(NaN,0.0)),complex(NaN,0.0)) -@test isequal(cosh(complex(NaN,-0.0)),complex(NaN,-0.0)) - -@test isequal(cosh(complex(NaN,5.0)),complex(NaN,NaN)) -@test isequal(cosh(complex(NaN,-5.0)),complex(NaN,NaN)) - -@test isequal(cosh(complex(NaN,NaN)),complex(NaN,NaN)) - +@test isequal(cosh(complex( 0.0, 0.0)), complex( 1.0, 0.0)) +@test isequal(cosh(complex( 0.0,-0.0)), complex( 1.0,-0.0)) +@test isequal(cosh(complex( 0.0, Inf)), complex( NaN, 0.0)) +@test isequal(cosh(complex( 0.0,-Inf)), complex( NaN,-0.0)) +@test isequal(cosh(complex( 0.0, NaN)), complex( NaN, 0.0)) + +@test isequal(cosh(complex(-0.0,-0.0)), complex( 1.0, 0.0)) +@test isequal(cosh(complex(-0.0, 0.0)), complex( 1.0,-0.0)) +@test isequal(cosh(complex(-0.0, NaN)), complex( NaN, 0.0)) + +@test isequal(cosh(complex( 5.0, Inf)), complex( NaN, NaN)) +@test isequal(cosh(complex( 5.0, NaN)), complex( NaN, NaN)) + +@test isequal(cosh(complex( Inf, 0.0)), complex( Inf, 0.0)) +@test isequal(cosh(complex( Inf,-0.0)), complex( Inf,-0.0)) +@test isequal(cosh(complex( Inf, 5.0)), complex(cos(5.0)*Inf,sin(5.0)* Inf)) +@test isequal(cosh(complex( Inf,-5.0)), complex(cos(5.0)*Inf,sin(5.0)*-Inf)) +@test isequal(cosh(complex( Inf, Inf)), complex( Inf, NaN)) +@test isequal(cosh(complex( Inf,-Inf)), complex( Inf, NaN)) +@test isequal(cosh(complex( Inf, NaN)), complex( Inf, NaN)) + +@test isequal(cosh(complex(-Inf,-0.0)), complex( Inf, 0.0)) +@test isequal(cosh(complex(-Inf, 0.0)), complex( Inf,-0.0)) +@test isequal(cosh(complex(-Inf,-5.0)), complex(cos(5.0)*Inf,sin(5.0)* Inf)) +@test isequal(cosh(complex(-Inf, 5.0)), complex(cos(5.0)*Inf,sin(5.0)*-Inf)) +@test isequal(cosh(complex(-Inf, Inf)), complex( Inf, NaN)) +@test isequal(cosh(complex(-Inf,-Inf)), complex( Inf, NaN)) +@test isequal(cosh(complex(-Inf, NaN)), complex( Inf, NaN)) + +@test isequal(cosh(complex( NaN, 0.0)), complex( NaN, 0.0)) +@test isequal(cosh(complex( NaN, 5.0)), complex( NaN, NaN)) +@test isequal(cosh(complex( NaN,-0.0)), complex( NaN,-0.0)) +@test isequal(cosh(complex( NaN,-5.0)), complex( NaN, NaN)) +@test isequal(cosh(complex( NaN, NaN)), complex( NaN, NaN)) # cos # cos(z) = cosh(iz) @@ -318,406 +253,339 @@ # cos(conj(z)) = conj(cos(z)) # cos(-z) = cos(z) -@test isequal(cos(complex(0.0,0.0)),complex(1.0,-0.0)) -@test isequal(cos(complex(0.0,-0.0)),complex(1.0,0.0)) -@test isequal(cos(complex(-0.0,0.0)),complex(1.0,0.0)) -@test isequal(cos(complex(-0.0,-0.0)),complex(1.0,-0.0)) - -# raise invalid flag -@test_fails cos(complex(Inf,0.0)) #complex(NaN,-0.0) -@test_fails cos(complex(-Inf,0.0)) #complex(NaN,0.0) - -@test isequal(cos(complex(NaN,0.0)),complex(NaN,0.0)) -@test isequal(cos(complex(NaN,-0.0)),complex(NaN,0.0)) - -# raise invalid flag -@test_fails cos(complex(Inf,5.0)) #complex(NaN,NaN) - -@test isequal(cos(complex(NaN,5.0)),complex(NaN,NaN)) - -@test isequal(cos(complex(0.0,-Inf)),complex(Inf,0.0)) -@test isequal(cos(complex(-0.0,-Inf)),complex(Inf,-0.0)) -@test isequal(cos(complex(-0.0,Inf)),complex(Inf,0.0)) -@test isequal(cos(complex(0.0,Inf)),complex(Inf,-0.0)) - -@test isequal(cos(complex(5.0,-Inf)),complex(cos(5.0)*Inf,sin(5.0)*Inf)) -@test isequal(cos(complex(-5.0,-Inf)),complex(cos(5.0)*Inf,sin(5.0)*-Inf)) -@test isequal(cos(complex(-5.0,Inf)),complex(cos(5.0)*Inf,sin(5.0)*Inf)) -@test isequal(cos(complex(5.0,Inf)),complex(cos(5.0)*Inf,sin(5.0)*-Inf)) - -# raise invalid flag -@test_fails cos(complex(Inf,Inf)) #complex(Inf,NaN) -@test_fails cos(complex(Inf,-Inf)) #complex(Inf,NaN) -@test_fails cos(complex(-Inf,-Inf)) #complex(Inf,NaN) -@test_fails cos(complex(-Inf,Inf)) #complex(Inf,NaN) - -@test isequal(cos(complex(NaN,Inf)),complex(Inf,NaN)) -@test isequal(cos(complex(NaN,-Inf)),complex(Inf,NaN)) - -@test isequal(cos(complex(0.0,NaN)),complex(NaN,0.0)) -@test isequal(cos(complex(-0.0,NaN)),complex(NaN,-0.0)) - -@test isequal(cos(complex(5.0,NaN)),complex(NaN,NaN)) -@test isequal(cos(complex(-5.0,NaN)),complex(NaN,NaN)) - -@test isequal(cos(complex(NaN,NaN)),complex(NaN,NaN)) - - - +@test isequal(cos(complex( 0.0, 0.0)), complex( 1.0,-0.0)) +@test isequal(cos(complex( 0.0,-0.0)), complex( 1.0, 0.0)) +@test isequal(cos(complex( 0.0,-Inf)), complex( Inf, 0.0)) +@test isequal(cos(complex( 0.0, Inf)), complex( Inf,-0.0)) +@test isequal(cos(complex( 0.0, NaN)), complex( NaN, 0.0)) +@test isequal(cos(complex(-0.0, 0.0)), complex( 1.0, 0.0)) +@test isequal(cos(complex(-0.0,-0.0)), complex( 1.0,-0.0)) +@test isequal(cos(complex(-0.0,-Inf)), complex( Inf,-0.0)) +@test isequal(cos(complex(-0.0, Inf)), complex( Inf, 0.0)) +@test isequal(cos(complex(-0.0, NaN)), complex( NaN,-0.0)) + +@test isequal(cos(complex( 5.0,-Inf)), complex(cos(5.0)*Inf,sin(5.0)* Inf)) +@test isequal(cos(complex( 5.0, Inf)), complex(cos(5.0)*Inf,sin(5.0)*-Inf)) +@test isequal(cos(complex( 5.0, NaN)), complex( NaN, NaN)) +@test isequal(cos(complex(-5.0,-Inf)), complex(cos(5.0)*Inf,sin(5.0)*-Inf)) +@test isequal(cos(complex(-5.0, Inf)), complex(cos(5.0)*Inf,sin(5.0)* Inf)) +@test isequal(cos(complex(-5.0, NaN)), complex( NaN, NaN)) + +@test isequal(cos(complex( Inf, 0.0)), complex( NaN,-0.0)) +@test isequal(cos(complex( Inf, 5.0)), complex( NaN, NaN)) +@test isequal(cos(complex( Inf, Inf)), complex( Inf, NaN)) +@test isequal(cos(complex( Inf,-Inf)), complex( Inf, NaN)) +@test isequal(cos(complex(-Inf, 0.0)), complex( NaN, 0.0)) +@test isequal(cos(complex(-Inf, Inf)), complex( Inf, NaN)) +@test isequal(cos(complex(-Inf,-Inf)), complex( Inf, NaN)) + +@test isequal(cos(complex( NaN, 0.0)), complex( NaN, 0.0)) +@test isequal(cos(complex( NaN,-0.0)), complex( NaN, 0.0)) +@test isequal(cos(complex( NaN, 5.0)), complex( NaN, NaN)) +@test isequal(cos(complex( NaN, Inf)), complex( Inf, NaN)) +@test isequal(cos(complex( NaN,-Inf)), complex( Inf, NaN)) +@test isequal(cos(complex( NaN, NaN)), complex( NaN, NaN)) # tanh # tanh(conj(z)) = conj(tanh(z)) # tanh(-z) = -tanh(z) -@test isequal(tanh(complex(0.0,0.0)),complex(0.0,0.0)) -@test isequal(tanh(complex(0.0,-0.0)),complex(0.0,-0.0)) -@test isequal(tanh(complex(-0.0,0.0)),complex(-0.0,0.0)) -@test isequal(tanh(complex(-0.0,-0.0)),complex(-0.0,-0.0)) - -# raise invalid flag -@test_fails tanh(complex(0.0,Inf)) #complex(NaN,0.0) -@test_fails tanh(complex(0.0,-Inf)) #complex(NaN,-0.0) +@test isequal(tanh(complex( 0.0, 0.0)),complex(0.0,0.0)) +@test isequal(tanh(complex( 0.0,-0.0)),complex(0.0,-0.0)) +@test_fails tanh(complex( 0.0, Inf)) #complex(NaN,0.0) +@test_fails tanh(complex( 0.0,-Inf)) #complex(NaN,-0.0) +@test isequal(tanh(complex( 0.0, NaN)),complex(NaN,NaN)) -@test isequal(tanh(complex(0.0,NaN)),complex(NaN,NaN)) +@test isequal(tanh(complex(-0.0, 0.0)),complex(-0.0,0.0)) +@test isequal(tanh(complex(-0.0,-0.0)),complex(-0.0,-0.0)) -# raise invalid flag -@test_fails tanh(complex(5.0,Inf)) #complex(NaN,NaN) +@test_fails tanh(complex( 5.0, Inf)) #complex(NaN,NaN) +@test isequal(tanh(complex( 5.0, NaN)),complex(NaN,NaN)) -@test isequal(tanh(complex(5.0,NaN)),complex(NaN,NaN)) +@test isequal(tanh(complex( Inf, 0.0)),complex(1.0, 0.0)) +@test isequal(tanh(complex( Inf,-0.0)),complex(1.0,-0.0)) +@test isequal(tanh(complex( Inf, 5.0)),complex(1.0,sin(2*5.0)* 0.0)) +@test isequal(tanh(complex( Inf,-5.0)),complex(1.0,sin(2*5.0)*-0.0)) +@test isequal(tanh(complex( Inf, Inf)),complex(1.0, 0.0)) +@test isequal(tanh(complex( Inf,-Inf)),complex(1.0,-0.0)) +@test isequal(tanh(complex( Inf, NaN)),complex(1.0, 0.0)) -@test isequal(tanh(complex(Inf,0.0)),complex(1.0,0.0)) -@test isequal(tanh(complex(Inf,-0.0)),complex(1.0,-0.0)) -@test isequal(tanh(complex(-Inf,0.0)),complex(-1.0,0.0)) +@test isequal(tanh(complex(-Inf, 0.0)),complex(-1.0, 0.0)) @test isequal(tanh(complex(-Inf,-0.0)),complex(-1.0,-0.0)) - -@test isequal(tanh(complex(Inf,5.0)),complex(1.0,sin(2*5.0)*0.0)) -@test isequal(tanh(complex(Inf,-5.0)),complex(1.0,sin(2*5.0)*-0.0)) -@test isequal(tanh(complex(-Inf,5.0)),complex(-1.0,sin(2*5.0)*0.0)) +@test isequal(tanh(complex(-Inf, 5.0)),complex(-1.0,sin(2*5.0)* 0.0)) @test isequal(tanh(complex(-Inf,-5.0)),complex(-1.0,sin(2*5.0)*-0.0)) - -@test isequal(tanh(complex(Inf,Inf)),complex(1.0,0.0)) -@test isequal(tanh(complex(Inf,-Inf)),complex(1.0,-0.0)) -@test isequal(tanh(complex(-Inf,Inf)),complex(-1.0,0.0)) +@test isequal(tanh(complex(-Inf, Inf)),complex(-1.0, 0.0)) @test isequal(tanh(complex(-Inf,-Inf)),complex(-1.0,-0.0)) +@test isequal(tanh(complex(-Inf, NaN)),complex(-1.0, 0.0)) -@test isequal(tanh(complex(Inf,NaN)),complex(1.0,0.0)) -@test isequal(tanh(complex(-Inf,NaN)),complex(-1.0,0.0)) - -@test isequal(tanh(complex(NaN,0.0)),complex(NaN,0.0)) -@test isequal(tanh(complex(NaN,-0.0)),complex(NaN,-0.0)) - -@test isequal(tanh(complex(NaN,5.0)),complex(NaN,NaN)) -@test isequal(tanh(complex(NaN,-5.0)),complex(NaN,NaN)) - -@test isequal(tanh(complex(NaN,NaN)),complex(NaN,NaN)) +@test isequal(tanh(complex( NaN, 0.0)),complex(NaN, 0.0)) +@test isequal(tanh(complex( NaN,-0.0)),complex(NaN,-0.0)) +@test isequal(tanh(complex( NaN, 5.0)),complex(NaN, NaN)) +@test isequal(tanh(complex( NaN,-5.0)),complex(NaN, NaN)) +@test isequal(tanh(complex( NaN, NaN)),complex(NaN, NaN)) # tan # tan(z) = -i tanh(iz) -@test_fails tan(complex(Inf,5.0)) #complex(NaN,NaN) - -@test isequal(tan(complex(NaN,5.0)),complex(NaN,NaN)) -@test isequal(tan(complex(0.0,Inf)),complex(0.0,1.0)) -@test isequal(tan(complex(-0.0,Inf)),complex(-0.0,1.0)) -@test isequal(tan(complex(0.0,-Inf)),complex(0.0,-1.0)) +@test isequal(tan(complex( 0.0, Inf)),complex( 0.0, 1.0)) +@test isequal(tan(complex( 0.0,-Inf)),complex( 0.0,-1.0)) +@test isequal(tan(complex( 0.0, NaN)),complex( 0.0, NaN)) @test isequal(tan(complex(-0.0,-Inf)),complex(-0.0,-1.0)) +@test isequal(tan(complex(-0.0, Inf)),complex(-0.0, 1.0)) +@test isequal(tan(complex(-0.0, NaN)),complex(-0.0, NaN)) -@test isequal(tan(complex(5.0,Inf)),complex(sin(2*5.0)*0.0,1.0)) -@test isequal(tan(complex(-5.0,Inf)),complex(sin(2*5.0)*-0.0,1.0)) -@test isequal(tan(complex(5.0,-Inf)),complex(sin(2*5.0)*0.0,-1.0)) +@test isequal(tan(complex( 5.0, Inf)),complex(sin(2*5.0)* 0.0, 1.0)) +@test isequal(tan(complex( 5.0,-Inf)),complex(sin(2*5.0)* 0.0,-1.0)) +@test isequal(tan(complex( 5.0, NaN)),complex( NaN, NaN)) +@test isequal(tan(complex(-5.0, Inf)),complex(sin(2*5.0)*-0.0, 1.0)) @test isequal(tan(complex(-5.0,-Inf)),complex(sin(2*5.0)*-0.0,-1.0)) +@test isequal(tan(complex(-5.0, NaN)),complex( NaN, NaN)) -@test isequal(tan(complex(Inf,Inf)),complex(0.0,1.0)) -@test isequal(tan(complex(-Inf,Inf)),complex(-0.0,1.0)) -@test isequal(tan(complex(Inf,-Inf)),complex(0.0,-1.0)) +@test_fails tan(complex( Inf, 5.0)) #complex(NaN,NaN) +@test isequal(tan(complex( Inf, Inf)),complex( 0.0, 1.0)) +@test isequal(tan(complex( Inf,-Inf)),complex (0.0,-1.0)) +@test isequal(tan(complex(-Inf, Inf)),complex(-0.0, 1.0)) @test isequal(tan(complex(-Inf,-Inf)),complex(-0.0,-1.0)) -@test isequal(tan(complex(NaN,Inf)),complex(0.0,1.0)) -@test isequal(tan(complex(NaN,-Inf)),complex(0.0,-1.0)) - -@test isequal(tan(complex(0.0,NaN)),complex(0.0,NaN)) -@test isequal(tan(complex(-0.0,NaN)),complex(-0.0,NaN)) - -@test isequal(tan(complex(5.0,NaN)),complex(NaN,NaN)) -@test isequal(tan(complex(-5.0,NaN)),complex(NaN,NaN)) - -@test isequal(tan(complex(NaN,NaN)),complex(NaN,NaN)) - - - +@test isequal(tan(complex( NaN, 5.0)),complex( NaN, NaN)) +@test isequal(tan(complex( NaN, Inf)),complex( 0.0, 1.0)) +@test isequal(tan(complex( NaN,-Inf)),complex( 0.0,-1.0)) +@test isequal(tan(complex( NaN, NaN)),complex( NaN, NaN)) # acosh # acosh(conj(z)) = conj(acosh(z)) -@test isequal(acosh(complex(0.0,0.0)),complex(0.0,pi/2)) -@test isequal(acosh(complex(0.0,-0.0)),complex(0.0,-pi/2)) -@test isequal(acosh(complex(-0.0,0.0)),complex(0.0,pi/2)) -@test isequal(acosh(complex(-0.0,-0.0)),complex(0.0,-pi/2)) - -@test isequal(acosh(complex(0.0,Inf)),complex(Inf,pi/2)) -@test isequal(acosh(complex(0.0,-Inf)),complex(Inf,-pi/2)) -@test isequal(acosh(complex(5.0,Inf)),complex(Inf,pi/2)) -@test isequal(acosh(complex(5.0,-Inf)),complex(Inf,-pi/2)) - -@test isequal(acosh(complex(5.0,NaN)),complex(NaN,NaN)) - -@test isequal(acosh(complex(-Inf,0.0)),complex(Inf,pi)) -@test isequal(acosh(complex(-Inf,-0.0)),complex(Inf,-pi)) -@test isequal(acosh(complex(-Inf,5.0)),complex(Inf,pi)) -@test isequal(acosh(complex(-Inf,-5.0)),complex(Inf,-pi)) - -@test isequal(acosh(complex(Inf,0.0)),complex(Inf,0.0)) -@test isequal(acosh(complex(Inf,-0.0)),complex(Inf,-0.0)) -@test isequal(acosh(complex(Inf,5.0)),complex(Inf,0.0)) -@test isequal(acosh(complex(Inf,-5.0)),complex(Inf,-0.0)) - -@test isequal(acosh(complex(-Inf,Inf)),complex(Inf,3*pi/4)) -@test isequal(acosh(complex(-Inf,-Inf)),complex(Inf,-3*pi/4)) - -@test isequal(acosh(complex(Inf,Inf)),complex(Inf,pi/4)) -@test isequal(acosh(complex(Inf,-Inf)),complex(Inf,-pi/4)) - -@test isequal(acosh(complex(Inf,NaN)),complex(Inf,NaN)) -@test isequal(acosh(complex(-Inf,NaN)),complex(Inf,NaN)) - -@test isequal(acosh(complex(NaN,Inf)),complex(Inf,NaN)) -@test isequal(acosh(complex(NaN,-Inf)),complex(Inf,NaN)) - -@test isequal(acosh(complex(NaN,NaN)),complex(NaN,NaN)) - - -# acos -# acos(conj(z)) = conj(acos(z)) -@test isequal(acos(complex(0.0,0.0)),complex(pi/2,-0.0)) -@test isequal(acos(complex(0.0,-0.0)),complex(pi/2,0.0)) -@test isequal(acos(complex(-0.0,0.0)),complex(pi/2,-0.0)) -@test isequal(acos(complex(-0.0,-0.0)),complex(pi/2,0.0)) - -@test isequal(acos(complex(0.0,NaN)),complex(pi/2,NaN)) -@test isequal(acos(complex(-0.0,NaN)),complex(pi/2,NaN)) - -@test isequal(acos(complex(0.0,Inf)),complex(pi/2,-Inf)) -@test isequal(acos(complex(0.0,-Inf)),complex(pi/2,Inf)) -@test isequal(acos(complex(5.0,Inf)),complex(pi/2,-Inf)) -@test isequal(acos(complex(5.0,-Inf)),complex(pi/2,Inf)) - -@test isequal(acos(complex(5.0,NaN)),complex(NaN,NaN)) - -@test isequal(acos(complex(-Inf,0.0)),complex(pi,-Inf)) -@test isequal(acos(complex(-Inf,-0.0)),complex(pi,Inf)) -@test isequal(acos(complex(-Inf,5.0)),complex(pi,-Inf)) -@test isequal(acos(complex(-Inf,-5.0)),complex(pi,Inf)) - -@test isequal(acos(complex(Inf,0.0)),complex(0.0,-Inf)) -@test isequal(acos(complex(Inf,-0.0)),complex(0.0,Inf)) -@test isequal(acos(complex(Inf,5.0)),complex(0.0,-Inf)) -@test isequal(acos(complex(Inf,-5.0)),complex(0.0,Inf)) - -@test isequal(acos(complex(-Inf,Inf)),complex(3*pi/4,-Inf)) -@test isequal(acos(complex(-Inf,-Inf)),complex(3*pi/4,Inf)) - -@test isequal(acos(complex(Inf,Inf)),complex(pi/4,-Inf)) -@test isequal(acos(complex(Inf,-Inf)),complex(pi/4,Inf)) - -@test isequal(acos(complex(Inf,NaN)),complex(NaN,Inf)) -@test isequal(acos(complex(-Inf,NaN)),complex(NaN,Inf)) - -@test isequal(acos(complex(NaN,0.0)),complex(NaN,NaN)) -@test isequal(acos(complex(NaN,5.0)),complex(NaN,NaN)) - -@test isequal(acos(complex(NaN,Inf)),complex(NaN,-Inf)) -@test isequal(acos(complex(NaN,-Inf)),complex(NaN,Inf)) - -@test isequal(acos(complex(NaN,NaN)),complex(NaN,NaN)) - - -# asinh -# asinh(conj(z)) = conj(asinh(z)) -# asinh(-z) = -asinh(z) -@test isequal(asinh(complex(0.0,0.0)),complex(0.0,0.0)) -@test isequal(asinh(complex(0.0,-0.0)),complex(0.0,-0.0)) -@test isequal(asinh(complex(-0.0,0.0)),complex(-0.0,0.0)) +@test isequal(acosh(complex( 0.0, 0.0)), complex( 0.0, pi/2)) +@test isequal(acosh(complex( 0.0,-0.0)), complex( 0.0,-pi/2)) +@test isequal(acosh(complex( 0.0, Inf)), complex( Inf, pi/2)) +@test isequal(acosh(complex( 0.0,-Inf)), complex( Inf,-pi/2)) +@test isequal(acosh(complex(-0.0, 0.0)), complex( 0.0, pi/2)) +@test isequal(acosh(complex(-0.0,-0.0)), complex( 0.0,-pi/2)) +@test isequal(acosh(complex( 5.0, Inf)), complex( Inf, pi/2)) +@test isequal(acosh(complex( 5.0,-Inf)), complex( Inf,-pi/2)) +@test isequal(acosh(complex( 5.0, NaN)), complex( NaN, NaN)) + +@test isequal(acosh(complex( Inf, 0.0)), complex( Inf, 0.0)) +@test isequal(acosh(complex( Inf,-0.0)), complex( Inf,-0.0)) +@test isequal(acosh(complex( Inf, 5.0)), complex( Inf, 0.0)) +@test isequal(acosh(complex( Inf,-5.0)), complex( Inf,-0.0)) +@test isequal(acosh(complex( Inf, Inf)), complex( Inf, pi/4)) +@test isequal(acosh(complex( Inf,-Inf)), complex( Inf,-pi/4)) +@test isequal(acosh(complex( Inf, NaN)), complex( Inf, NaN)) + +@test isequal(acosh(complex(-Inf, 0.0)), complex( Inf, pi)) +@test isequal(acosh(complex(-Inf,-0.0)), complex( Inf,-pi)) +@test isequal(acosh(complex(-Inf, 5.0)), complex( Inf, pi)) +@test isequal(acosh(complex(-Inf,-5.0)), complex( Inf,-pi)) +@test isequal(acosh(complex(-Inf, Inf)), complex( Inf, 3*pi/4)) +@test isequal(acosh(complex(-Inf,-Inf)), complex( Inf,-3*pi/4)) +@test isequal(acosh(complex(-Inf, NaN)), complex( Inf, NaN)) + +@test isequal(acosh(complex( NaN, Inf)), complex( Inf, NaN)) +@test isequal(acosh(complex( NaN,-Inf)), complex( Inf, NaN)) +@test isequal(acosh(complex( NaN, NaN)), complex( NaN, NaN)) + +# +## acos +## acos(conj(z)) = conj(acos(z)) + +@test isequal(acos(complex( 0.0, 0.0)),complex(pi/2,-0.0)) +@test isequal(acos(complex( 0.0,-0.0)),complex(pi/2, 0.0)) +@test isequal(acos(complex( 0.0, Inf)),complex(pi/2,-Inf)) +@test isequal(acos(complex( 0.0,-Inf)),complex(pi/2, Inf)) +@test isequal(acos(complex( 0.0, NaN)),complex(pi/2, NaN)) + +@test isequal(acos(complex(-0.0, 0.0)),complex(pi/2,-0.0)) +@test isequal(acos(complex(-0.0,-0.0)),complex(pi/2, 0.0)) +@test isequal(acos(complex(-0.0, NaN)),complex(pi/2, NaN)) + +@test isequal(acos(complex( 5.0, Inf)),complex(pi/2,-Inf)) +@test isequal(acos(complex( 5.0,-Inf)),complex(pi/2, Inf)) +@test isequal(acos(complex( 5.0, NaN)),complex( NaN, NaN)) + +@test isequal(acos(complex( Inf, 0.0)),complex( 0.0,-Inf)) +@test isequal(acos(complex( Inf,-0.0)),complex( 0.0, Inf)) +@test isequal(acos(complex( Inf, 5.0)),complex( 0.0,-Inf)) +@test isequal(acos(complex( Inf,-5.0)),complex( 0.0, Inf)) +@test isequal(acos(complex( Inf, Inf)),complex(pi/4,-Inf)) +@test isequal(acos(complex( Inf,-Inf)),complex(pi/4, Inf)) +@test isequal(acos(complex( Inf, NaN)),complex( NaN, Inf)) + +@test isequal(acos(complex(-Inf, 0.0)),complex(pi,-Inf)) +@test isequal(acos(complex(-Inf,-0.0)),complex(pi, Inf)) +@test isequal(acos(complex(-Inf, 5.0)),complex(pi,-Inf)) +@test isequal(acos(complex(-Inf,-5.0)),complex(pi, Inf)) +@test isequal(acos(complex(-Inf, Inf)),complex(3*pi/4,-Inf)) +@test isequal(acos(complex(-Inf,-Inf)),complex(3*pi/4, Inf)) +@test isequal(acos(complex(-Inf, NaN)),complex( NaN, Inf)) + +@test isequal(acos(complex( NaN, 0.0)),complex( NaN, NaN)) +@test isequal(acos(complex( NaN, 5.0)),complex( NaN, NaN)) +@test isequal(acos(complex( NaN, Inf)),complex( NaN,-Inf)) +@test isequal(acos(complex( NaN,-Inf)),complex( NaN, Inf)) +@test isequal(acos(complex( NaN, NaN)),complex( NaN, NaN)) + + + +## asinh +## asinh(conj(z)) = conj(asinh(z)) +## asinh(-z) = -asinh(z) +@test isequal(asinh(complex( 0.0, 0.0)),complex( 0.0, 0.0)) +@test isequal(asinh(complex( 0.0,-0.0)),complex( 0.0,-0.0)) +@test isequal(asinh(complex( 0.0, Inf)),complex( Inf, pi/2)) +@test isequal(asinh(complex( 0.0,-Inf)),complex( Inf,-pi/2)) +@test isequal(asinh(complex( 0.0, NaN)),complex( NaN, NaN)) + +@test isequal(asinh(complex(-0.0, 0.0)),complex(-0.0, 0.0)) @test isequal(asinh(complex(-0.0,-0.0)),complex(-0.0,-0.0)) - -@test isequal(asinh(complex(0.0,Inf)),complex(Inf,pi/2)) -@test isequal(asinh(complex(0.0,-Inf)),complex(Inf,-pi/2)) -@test isequal(asinh(complex(-0.0,Inf)),complex(-Inf,pi/2)) +@test isequal(asinh(complex(-0.0, Inf)),complex(-Inf, pi/2)) @test isequal(asinh(complex(-0.0,-Inf)),complex(-Inf,-pi/2)) -@test isequal(asinh(complex(5.0,Inf)),complex(Inf,pi/2)) -@test isequal(asinh(complex(5.0,-Inf)),complex(Inf,-pi/2)) -@test isequal(asinh(complex(-5.0,Inf)),complex(-Inf,pi/2)) +@test isequal(asinh(complex( 5.0, Inf)),complex( Inf, pi/2)) +@test isequal(asinh(complex( 5.0,-Inf)),complex( Inf,-pi/2)) +@test isequal(asinh(complex( 5.0, NaN)),complex( NaN, NaN)) +@test isequal(asinh(complex(-5.0, Inf)),complex(-Inf, pi/2)) @test isequal(asinh(complex(-5.0,-Inf)),complex(-Inf,-pi/2)) -@test isequal(asinh(complex(0.0,NaN)),complex(NaN,NaN)) -@test isequal(asinh(complex(5.0,NaN)),complex(NaN,NaN)) - -@test isequal(asinh(complex(Inf,Inf)),complex(Inf,pi/4)) -@test isequal(asinh(complex(Inf,-Inf)),complex(Inf,-pi/4)) -@test isequal(asinh(complex(-Inf,Inf)),complex(-Inf,pi/4)) +@test isequal(asinh(complex( Inf, Inf)),complex( Inf, pi/4)) +@test isequal(asinh(complex( Inf,-Inf)),complex( Inf,-pi/4)) +@test isequal(asinh(complex( Inf, NaN)),complex( Inf, NaN)) +@test isequal(asinh(complex(-Inf, Inf)),complex(-Inf, pi/4)) @test isequal(asinh(complex(-Inf,-Inf)),complex(-Inf,-pi/4)) +@test isequal(asinh(complex(-Inf, NaN)),complex(-Inf, NaN)) -@test isequal(asinh(complex(Inf,NaN)),complex(Inf,NaN)) -@test isequal(asinh(complex(-Inf,NaN)),complex(-Inf,NaN)) - -@test isequal(asinh(complex(NaN,0.0)),complex(NaN,0.0)) -@test isequal(asinh(complex(NaN,-0.0)),complex(NaN,-0.0)) - -@test isequal(asinh(complex(NaN,5.0)),complex(NaN,NaN)) - -@test isequal(asinh(complex(NaN,Inf)),complex(Inf,NaN)) -@test isequal(asinh(complex(NaN,-Inf)),complex(Inf,NaN)) - -@test isequal(asinh(complex(NaN,NaN)),complex(NaN,NaN)) - +@test isequal(asinh(complex( NaN, 0.0)),complex( NaN, 0.0)) +@test isequal(asinh(complex( NaN,-0.0)),complex( NaN,-0.0)) +@test isequal(asinh(complex( NaN, 5.0)),complex( NaN, NaN)) +@test isequal(asinh(complex( NaN, Inf)),complex( Inf, NaN)) +@test isequal(asinh(complex( NaN,-Inf)),complex( Inf, NaN)) +@test isequal(asinh(complex( NaN, NaN)),complex( NaN, NaN)) # asin # asin(z) = -i*asinh(iz) -@test isequal(asin(complex(0.0,0.0)),complex(0.0,0.0)) -@test isequal(asin(complex(0.0,-0.0)),complex(0.0,-0.0)) -@test isequal(asin(complex(-0.0,0.0)),complex(-0.0,0.0)) -@test isequal(asin(complex(-0.0,-0.0)),complex(-0.0,-0.0)) -@test isequal(asin(complex(Inf,0.0)),complex(pi/2,Inf)) -@test isequal(asin(complex(-Inf,0.0)),complex(-pi/2,Inf)) -@test isequal(asin(complex(Inf,-0.0)),complex(pi/2,-Inf)) +@test isequal(asin(complex( 0.0, 0.0)),complex( 0.0, 0.0)) +@test isequal(asin(complex( 0.0,-0.0)),complex( 0.0,-0.0)) +@test isequal(asin(complex(-0.0, 0.0)),complex(-0.0, 0.0)) +@test isequal(asin(complex( 0.0, NaN)),complex( 0.0, NaN)) +@test isequal(asin(complex(-0.0,-0.0)),complex(-0.0,-0.0)) +@test isequal(asin(complex(-0.0, NaN)),complex(-0.0, NaN)) +@test isequal(asin(complex( 5.0, NaN)),complex( NaN, NaN)) + +@test isequal(asin(complex( Inf, 0.0)),complex( pi/2, Inf)) +@test isequal(asin(complex( Inf,-0.0)),complex( pi/2,-Inf)) +@test isequal(asin(complex( Inf, 5.0)),complex( pi/2, Inf)) +@test isequal(asin(complex( Inf,-5.0)),complex( pi/2,-Inf)) +@test isequal(asin(complex( Inf, Inf)),complex( pi/4, Inf)) +@test isequal(asin(complex( Inf,-Inf)),complex( pi/4,-Inf)) +@test isequal(asin(complex( Inf, NaN)),complex( NaN, Inf)) + +@test isequal(asin(complex(-Inf, 0.0)),complex(-pi/2, Inf)) @test isequal(asin(complex(-Inf,-0.0)),complex(-pi/2,-Inf)) - -@test isequal(asin(complex(Inf,5.0)),complex(pi/2,Inf)) -@test isequal(asin(complex(-Inf,5.0)),complex(-pi/2,Inf)) -@test isequal(asin(complex(Inf,-5.0)),complex(pi/2,-Inf)) +@test isequal(asin(complex(-Inf, 5.0)),complex(-pi/2, Inf)) @test isequal(asin(complex(-Inf,-5.0)),complex(-pi/2,-Inf)) - -@test isequal(asin(complex(NaN,0.0)),complex(NaN,NaN)) -@test isequal(asin(complex(NaN,5.0)),complex(NaN,NaN)) - -@test isequal(asin(complex(Inf,Inf)),complex(pi/4,Inf)) -@test isequal(asin(complex(Inf,-Inf)),complex(pi/4,-Inf)) -@test isequal(asin(complex(-Inf,Inf)),complex(-pi/4,Inf)) +@test isequal(asin(complex(-Inf, Inf)),complex(-pi/4, Inf)) @test isequal(asin(complex(-Inf,-Inf)),complex(-pi/4,-Inf)) +@test isequal(asin(complex(-Inf, NaN)),complex( NaN, Inf)) -@test isequal(asin(complex(NaN,Inf)),complex(NaN,Inf)) -@test isequal(asin(complex(NaN,-Inf)),complex(NaN,-Inf)) - -@test isequal(asin(complex(0.0,NaN)),complex(0.0,NaN)) -@test isequal(asin(complex(-0.0,NaN)),complex(-0.0,NaN)) - -@test isequal(asin(complex(5.0,NaN)),complex(NaN,NaN)) - -@test isequal(asin(complex(Inf,NaN)),complex(NaN,Inf)) -@test isequal(asin(complex(-Inf,NaN)),complex(NaN,Inf)) - -@test isequal(asin(complex(NaN,NaN)),complex(NaN,NaN)) - - +@test isequal(asin(complex( NaN, 0.0)),complex( NaN, NaN)) +@test isequal(asin(complex( NaN, 5.0)),complex( NaN, NaN)) +@test isequal(asin(complex( NaN, Inf)),complex( NaN, Inf)) +@test isequal(asin(complex( NaN,-Inf)),complex( NaN,-Inf)) +@test isequal(asin(complex( NaN, NaN)),complex( NaN, NaN)) # atanh # atanh(conj(z)) = conj(atanh(z)) # atang(-z) = -atanh(z) -@test isequal(atanh(complex(0.0,0.0)),complex(0.0,0.0)) -@test isequal(atanh(complex(0.0,-0.0)),complex(0.0,-0.0)) -@test isequal(atanh(complex(-0.0,0.0)),complex(-0.0,0.0)) -@test isequal(atanh(complex(-0.0,-0.0)),complex(-0.0,-0.0)) - -@test isequal(atanh(complex(0.0,NaN)),complex(0.0,NaN)) -@test isequal(atanh(complex(-0.0,NaN)),complex(-0.0,NaN)) - -# raise divide-by-zero flag -@test isequal(atanh(complex(1.0,0.0)),complex(Inf,0.0)) +@test isequal(atanh(complex( 0.0, 0.0)),complex( 0.0, 0.0)) +@test isequal(atanh(complex( 0.0,-0.0)),complex( 0.0,-0.0)) +@test isequal(atanh(complex( 0.0, NaN)),complex( 0.0, NaN)) +@test isequal(atanh(complex( 0.0, Inf)),complex( 0.0, pi/2)) +@test isequal(atanh(complex( 0.0,-Inf)),complex( 0.0,-pi/2)) -@test isequal(atanh(complex(0.0,Inf)),complex(0.0,pi/2)) -@test isequal(atanh(complex(0.0,-Inf)),complex(0.0,-pi/2)) -@test isequal(atanh(complex(-0.0,Inf)),complex(-0.0,pi/2)) +@test isequal(atanh(complex(-0.0, NaN)),complex(-0.0, NaN)) +@test isequal(atanh(complex(-0.0, 0.0)),complex(-0.0, 0.0)) +@test isequal(atanh(complex(-0.0,-0.0)),complex(-0.0,-0.0)) +@test isequal(atanh(complex(-0.0, Inf)),complex(-0.0, pi/2)) @test isequal(atanh(complex(-0.0,-Inf)),complex(-0.0,-pi/2)) -@test isequal(atanh(complex(5.0,Inf)),complex(0.0,pi/2)) -@test isequal(atanh(complex(5.0,-Inf)),complex(0.0,-pi/2)) -@test isequal(atanh(complex(-5.0,Inf)),complex(-0.0,pi/2)) +@test isequal(atanh(complex( 1.0, 0.0)),complex( Inf, 0.0)) +@test isequal(atanh(complex( 5.0, Inf)),complex( 0.0, pi/2)) +@test isequal(atanh(complex( 5.0,-Inf)),complex( 0.0,-pi/2)) +@test isequal(atanh(complex( 5.0, NaN)),complex( NaN, NaN)) +@test isequal(atanh(complex(-5.0, Inf)),complex(-0.0, pi/2)) @test isequal(atanh(complex(-5.0,-Inf)),complex(-0.0,-pi/2)) +@test isequal(atanh(complex(-5.0, NaN)),complex( NaN, NaN)) -@test isequal(atanh(complex(5.0,NaN)),complex(NaN,NaN)) -@test isequal(atanh(complex(-5.0,NaN)),complex(NaN,NaN)) +@test isequal(atanh(complex( Inf, 0.0)),complex(0.0, pi/2)) +@test isequal(atanh(complex( Inf,-0.0)),complex(0.0,-pi/2)) +@test isequal(atanh(complex( Inf, 5.0)),complex(0.0, pi/2)) +@test isequal(atanh(complex( Inf,-5.0)),complex(0.0,-pi/2)) +@test isequal(atanh(complex( Inf, Inf)),complex(0.0, pi/2)) +@test isequal(atanh(complex( Inf,-Inf)),complex(0.0,-pi/2)) +@test isequal(atanh(complex( Inf, NaN)),complex(0.0, NaN)) -@test isequal(atanh(complex(Inf,0.0)),complex(0.0,pi/2)) -@test isequal(atanh(complex(Inf,-0.0)),complex(0.0,-pi/2)) -@test isequal(atanh(complex(-Inf,0.0)),complex(-0.0,pi/2)) +@test isequal(atanh(complex(-Inf, 0.0)),complex(-0.0, pi/2)) @test isequal(atanh(complex(-Inf,-0.0)),complex(-0.0,-pi/2)) - -@test isequal(atanh(complex(Inf,5.0)),complex(0.0,pi/2)) -@test isequal(atanh(complex(Inf,-5.0)),complex(0.0,-pi/2)) -@test isequal(atanh(complex(-Inf,5.0)),complex(-0.0,pi/2)) +@test isequal(atanh(complex(-Inf, 5.0)),complex(-0.0, pi/2)) @test isequal(atanh(complex(-Inf,-5.0)),complex(-0.0,-pi/2)) - -@test isequal(atanh(complex(Inf,Inf)),complex(0.0,pi/2)) -@test isequal(atanh(complex(Inf,-Inf)),complex(0.0,-pi/2)) -@test isequal(atanh(complex(-Inf,Inf)),complex(-0.0,pi/2)) +@test isequal(atanh(complex(-Inf, Inf)),complex(-0.0, pi/2)) @test isequal(atanh(complex(-Inf,-Inf)),complex(-0.0,-pi/2)) +@test isequal(atanh(complex(-Inf, NaN)),complex(-0.0, NaN)) -@test isequal(atanh(complex(Inf,NaN)),complex(0.0,NaN)) -@test isequal(atanh(complex(-Inf,NaN)),complex(-0.0,NaN)) - -@test isequal(atanh(complex(NaN,0.0)),complex(NaN,NaN)) -@test isequal(atanh(complex(NaN,-0.0)),complex(NaN,NaN)) -@test isequal(atanh(complex(NaN,5.0)),complex(NaN,NaN)) -@test isequal(atanh(complex(NaN,-5.0)),complex(NaN,NaN)) - -@test isequal(atanh(complex(NaN,Inf)),complex(0.0,pi/2)) -@test isequal(atanh(complex(NaN,-Inf)),complex(0.0,-pi/2)) - -@test isequal(atanh(complex(NaN,NaN)),complex(NaN,NaN)) +@test isequal(atanh(complex( NaN, 0.0)),complex( NaN, NaN)) +@test isequal(atanh(complex( NaN,-0.0)),complex( NaN, NaN)) +@test isequal(atanh(complex( NaN, 5.0)),complex( NaN, NaN)) +@test isequal(atanh(complex( NaN,-5.0)),complex( NaN, NaN)) +@test isequal(atanh(complex( NaN, Inf)),complex( 0.0, pi/2)) +@test isequal(atanh(complex( NaN,-Inf)),complex( 0.0,-pi/2)) +@test isequal(atanh(complex( NaN, NaN)),complex( NaN, NaN)) # atan # atan(z) = -i*tanh(iz) -@test isequal(atan(complex(0.0,0.0)),complex(0.0,0.0)) -@test isequal(atan(complex(0.0,-0.0)),complex(0.0,-0.0)) -@test isequal(atan(complex(-0.0,0.0)),complex(-0.0,0.0)) +@test isequal(atan(complex( 0.0, 0.0)),complex( 0.0, 0.0)) +@test isequal(atan(complex( 0.0,-0.0)),complex( 0.0,-0.0)) +@test isequal(atan(complex( 0.0, 1.0)),complex( 0.0, Inf)) +@test isequal(atan(complex( 0.0, Inf)),complex( pi/2, 0.0)) +@test isequal(atan(complex( 0.0,-Inf)),complex( pi/2,-0.0)) +@test isequal(atan(complex( 0.0, NaN)),complex( NaN, NaN)) + +@test isequal(atan(complex(-0.0, 0.0)),complex(-0.0, 0.0)) @test isequal(atan(complex(-0.0,-0.0)),complex(-0.0,-0.0)) +@test isequal(atan(complex(-0.0, Inf)),complex(-pi/2, 0.0)) +@test isequal(atan(complex(-0.0,-Inf)),complex(-pi/2,-0.0)) +@test isequal(atan(complex(-0.0, NaN)),complex( NaN, NaN)) -@test isequal(atan(complex(NaN,0.0)),complex(NaN,0.0)) -@test isequal(atan(complex(NaN,-0.0)),complex(NaN,-0.0)) +@test isequal(atan(complex( 5.0, Inf)),complex( pi/2, 0.0)) +@test isequal(atan(complex( 5.0,-Inf)),complex( pi/2,-0.0)) +@test isequal(atan(complex( 5.0, NaN)),complex( NaN, NaN)) -# raise divide-by-zero flag -@test isequal(atan(complex(0.0,1.0)),complex(0.0,Inf)) +@test isequal(atan(complex(-5.0, Inf)),complex(-pi/2, 0.0)) +@test isequal(atan(complex(-5.0,-Inf)),complex(-pi/2,-0.0)) +@test isequal(atan(complex(-5.0, NaN)),complex( NaN, NaN)) -@test isequal(atan(complex(Inf,0.0)),complex(pi/2,0.0)) -@test isequal(atan(complex(-Inf,0.0)),complex(-pi/2,0.0)) -@test isequal(atan(complex(Inf,-0.0)),complex(pi/2,-0.0)) -@test isequal(atan(complex(-Inf,-0.0)),complex(-pi/2,-0.0)) +@test isequal(atan(complex( Inf, 0.0)),complex( pi/2, 0.0)) +@test isequal(atan(complex( Inf,-0.0)),complex( pi/2,-0.0)) +@test isequal(atan(complex( Inf, 5.0)),complex( pi/2, 0.0)) +@test isequal(atan(complex( Inf,-5.0)),complex( pi/2,-0.0)) +@test isequal(atan(complex( Inf, Inf)),complex( pi/2, 0.0)) +@test isequal(atan(complex( Inf,-Inf)),complex( pi/2,-0.0)) +@test isequal(atan(complex( Inf, NaN)),complex( pi/2, 0.0)) -@test isequal(atan(complex(Inf,5.0)),complex(pi/2,0.0)) -@test isequal(atan(complex(-Inf,5.0)),complex(-pi/2,0.0)) -@test isequal(atan(complex(Inf,-5.0)),complex(pi/2,-0.0)) +@test isequal(atan(complex(-Inf, 0.0)),complex(-pi/2, 0.0)) +@test isequal(atan(complex(-Inf,-0.0)),complex(-pi/2,-0.0)) +@test isequal(atan(complex(-Inf, 5.0)),complex(-pi/2, 0.0)) @test isequal(atan(complex(-Inf,-5.0)),complex(-pi/2,-0.0)) - -@test isequal(atan(complex(NaN,5.0)),complex(NaN,NaN)) -@test isequal(atan(complex(NaN,-5.0)),complex(NaN,NaN)) - -@test isequal(atan(complex(0.0,Inf)),complex(pi/2,0.0)) -@test isequal(atan(complex(-0.0,Inf)),complex(-pi/2,0.0)) -@test isequal(atan(complex(0.0,-Inf)),complex(pi/2,-0.0)) -@test isequal(atan(complex(-0.0,-Inf)),complex(-pi/2,-0.0)) - -@test isequal(atan(complex(5.0,Inf)),complex(pi/2,0.0)) -@test isequal(atan(complex(-5.0,Inf)),complex(-pi/2,0.0)) -@test isequal(atan(complex(5.0,-Inf)),complex(pi/2,-0.0)) -@test isequal(atan(complex(-5.0,-Inf)),complex(-pi/2,-0.0)) - -@test isequal(atan(complex(Inf,Inf)),complex(pi/2,0.0)) -@test isequal(atan(complex(Inf,-Inf)),complex(pi/2,-0.0)) -@test isequal(atan(complex(-Inf,Inf)),complex(-pi/2,0.0)) +@test isequal(atan(complex(-Inf, Inf)),complex(-pi/2, 0.0)) @test isequal(atan(complex(-Inf,-Inf)),complex(-pi/2,-0.0)) - -@test isequal(atan(complex(NaN,Inf)),complex(NaN,0.0)) -@test isequal(atan(complex(NaN,-Inf)),complex(NaN,-0.0)) - -@test isequal(atan(complex(0.0,NaN)),complex(NaN,NaN)) -@test isequal(atan(complex(-0.0,NaN)),complex(NaN,NaN)) -@test isequal(atan(complex(5.0,NaN)),complex(NaN,NaN)) -@test isequal(atan(complex(-5.0,NaN)),complex(NaN,NaN)) - -@test isequal(atan(complex(Inf,NaN)),complex(pi/2,0.0)) -@test isequal(atan(complex(-Inf,NaN)),complex(-pi/2,0.0)) - -@test isequal(atan(complex(NaN,NaN)),complex(NaN,NaN)) +@test isequal(atan(complex(-Inf, NaN)),complex(-pi/2, 0.0)) + +@test isequal(atan(complex( NaN, 0.0)),complex( NaN, 0.0)) +@test isequal(atan(complex( NaN,-0.0)),complex( NaN,-0.0)) +@test isequal(atan(complex( NaN, 5.0)),complex( NaN, NaN)) +@test isequal(atan(complex( NaN,-5.0)),complex( NaN, NaN)) +@test isequal(atan(complex( NaN, Inf)),complex( NaN, 0.0)) +@test isequal(atan(complex( NaN,-Inf)),complex( NaN,-0.0)) +@test isequal(atan(complex( NaN, NaN)),complex( NaN, NaN)) From ae6d757d01918eaf3c2ee74c738644b4ebd39a8f Mon Sep 17 00:00:00 2001 From: Jeff Bezanson Date: Mon, 20 May 2013 01:56:22 -0400 Subject: [PATCH 5/5] complex function improvements; make test-complex pass formatting fixes --- base/complex.jl | 363 +++++++++++++++++++++++++++--------------------- test/complex.jl | 5 +- 2 files changed, 208 insertions(+), 160 deletions(-) diff --git a/base/complex.jl b/base/complex.jl index 3498c4fa9d5f2..bf53414ca227f 100644 --- a/base/complex.jl +++ b/base/complex.jl @@ -139,69 +139,99 @@ sign(z::Complex) = z/abs(z) function /(a::Complex, b::Complex) are = real(a); aim = imag(a); bre = real(b); bim = imag(b) - abr = abs(bre) - abi = abs(bim) - if abr <= abi - r = bre / bim - den = bim * (one(r) + r*r) + if abs(bre) <= abs(bim) + if isinf(bre) && isinf(bim) + r = sign(bre)/sign(bim) + else + r = bre / bim + end + den = bim + r*bre complex((are*r + aim)/den, (aim*r - are)/den) else - r = bim / bre - den = bre * (one(r) + r*r) + if isinf(bre) && isinf(bim) + r = sign(bim)/sign(bre) + else + r = bim / bre + end + den = bre + r*bim complex((are + aim*r)/den, (aim - are*r)/den) end end function /(a::Real, b::Complex) bre = real(b); bim = imag(b) - abr = abs(bre) - abi = abs(bim) - if abr <= abi - r = bre / bim - den = bim * (one(r) + r*r) + if abs(bre) <= abs(bim) + if isinf(bre) && isinf(bim) + r = sign(bre)/sign(bim) + else + r = bre / bim + end + den = bim + r*bre complex(a*r/den, -a/den) else - r = bim / bre - den = bre * (one(r) + r*r) + if isinf(bre) && isinf(bim) + r = sign(bim)/sign(bre) + else + r = bim / bre + end + den = bre + r*bim complex(a/den, -a*r/den) end end +function ssqs{T<:FloatingPoint}(x::T, y::T) + k::Int = 0 + ρ = x*x + y*y + if !isfinite(ρ) && (isinf(x) || isinf(y)) + ρ = convert(T, Inf) + elseif isinf(ρ) || (ρ==0 && (x!=0 || y!=0)) || ρ= 0 - return complex(r, iz/r/2) - end - return complex(abs(iz)/r/2, copysign(r,iz)) -end +sqrt(z::Complex) = sqrt(float(z)) + +# function sqrt(z::Complex) +# rz = float(real(z)) +# iz = float(imag(z)) +# r = sqrt((hypot(rz,iz)+abs(rz))/2) +# if r == 0 +# return complex(zero(iz), iz) +# end +# if rz >= 0 +# return complex(r, iz/r/2) +# end +# return complex(abs(iz)/r/2, copysign(r,iz)) +# end cis(theta::Real) = complex(cos(theta),sin(theta)) function cis(z::Complex) @@ -211,82 +241,47 @@ end angle(z::Complex) = atan2(imag(z), real(z)) -function sin(z::Complex) - zr, zi = reim(z) - if !isfinite(zi) && zr == 0 return complex(zr, zi) end - if isnan(zr) && !isfinite(zi) return complex(zr, zi) end - if !isfinite(zr) && zi == 0 return complex(oftype(zr, NaN), zi) end - if !isfinite(zr) && isfinite(zi) return complex(oftype(zr, NaN), oftype(zi, NaN)) end - if !isfinite(zr) && !isfinite(zi) return complex(zr, oftype(zi, NaN)) end - wr = sin(zr)*cosh(zi) - wi = cos(zr)*sinh(zi) - complex(wr, wi) -end - -function cos(z::Complex) - zr, zi = reim(z) - if !isfinite(zi) && zr == 0 - return complex(isnan(zi) ? zi : oftype(zi, Inf), - isnan(zi) ? zr : zr*-sign(zi)) end - if !isfinite(zr) && isinf(zi) - return complex(oftype(zr, Inf), oftype(zi, NaN)) end - if isinf(zr) - return complex(oftype(zr, NaN), zi==0 ? -copysign(zi, zr) : oftype(zi, NaN)) end - if isnan(zr) && zi==0 return complex(zr, abs(zi)) end - wr = cos(zr)*cosh(zi) - wi = -sin(zr)*sinh(zi) - complex(wr, wi) -end - -function ssqs{T}(z::Complex{T}) - k::Int=0 - ρ=abs2(z) - x, y=reim(z) - if !isfinite(ρ) && (isinf(x) || isinf(y)) - ρ=convert(T, Inf) - elseif isinf(ρ) || (ρ==zero(ρ) && (x!=zero(x) || y!=zero(y))) || ρ asinh(Ω) #Overflow? - complex(copysign(one(T),ξ), copysign(zero(T),η*(isfinite(η) ? sin(2*abs(η)) : 1))) + complex(copysign(one(T),ξ), + copysign(zero(T),η*(isfinite(η) ? sin(2*abs(η)) : one(η)))) else t = tan(η) - β = 1+t^2 #sec(η)^2 + β = 1+t*t #sec(η)^2 s = sinh(ξ) - ρ = sqrt(1 + s^2) #cosh(ξ) + ρ = sqrt(1 + s*s) #cosh(ξ) if isinf(t) complex(ρ/s,1/t) else - complex(β*ρ*s,t)/(1+β*s^2) + complex(β*ρ*s,t)/(1+β*s*s) end end end +tanh(z::Complex) = tanh(float(z)) function asinh(z::Complex) - w=asin(complex(-imag(z),real(z))) + w = asin(complex(-imag(z),real(z))) complex(imag(w),-real(w)) end function acosh(z::Complex) - zr, zi=reim(z) + zr, zi = reim(z) if isnan(zr) || isnan(zi) if isinf(zr) || isinf(zi) return complex(oftype(zr, Inf), oftype(zi, NaN)) @@ -491,30 +517,51 @@ function acosh(z::Complex) elseif zr==-Inf && zi===-0.0 #Edge case is wrong - WHY? return complex(Inf, -pi) end - ξ=asinh(real(sqrt(conj(z-1))*sqrt(z+1))) - η=2atan2(imag(sqrt(z-1)),real(sqrt(z+1))) + ξ = asinh(real(sqrt(conj(z-1))*sqrt(z+1))) + η = 2atan2(imag(sqrt(z-1)),real(sqrt(z+1))) if isinf(zr) && isinf(zi) - η -= pi/4 * sign(zi) * sign(zr) end + η -= pi/4 * sign(zi) * sign(zr) + end complex(ξ, η) end -function atanh{T}(z::Complex{T}) - const Ω=prevfloat(typemax(T)) - const θ=sqrt(Ω)/4 - const ρ=1/θ - x=real(z) - y=imag(z) - if x > θ || abs(y) > θ #Prevent overflow - return complex(copysign(pi/2, y), real(1/z)) - elseif x==one(x) - ym=abs(y)+ρ - ξ=log(sqrt(sqrt(4+y^2))/sqrt(ym)) - η=copysign(pi/2+atan(ym/2), y)/2 +function atanh{T<:FloatingPoint}(z::Complex{T}) + const Ω = prevfloat(typemax(T)) + const θ = sqrt(Ω)/4 + const ρ = 1/θ + x, y = reim(z) + ax = abs(x) + ay = abs(y) + if ax > θ || ay > θ #Prevent overflow + if isnan(y) + if isinf(x) + return complex(copysign(zero(x),x), y) + else + return complex(real(1/z), y) + end + end + if isinf(y) + return complex(copysign(zero(x),x), copysign(pi/2, y)) + end + return complex(real(1/z), copysign(pi/2, y)) + elseif ax==1 + if y == 0 + ξ = copysign(oftype(x,Inf),x) + η = zero(y) + else + ym = ay+ρ + ξ = log(sqrt(sqrt(4+y*y))/sqrt(ym)) + η = copysign(pi/2+atan(ym/2), y)/2 + end else #Normal case - ysq=(abs(y)+ρ)^2 - ξ=log1p(4x/((1-x)^2 + ysq))/4 - η=angle(complex(((1-x)*(1+x)-ysq)/2, y)) + ysq = (ay+ρ)^2 + if x == 0 + ξ = x + else + ξ = log1p(4x/((1-x)^2 + ysq))/4 + end + η = angle(complex((1-x)*(1+x)-ysq, 2y))/2 end complex(ξ, η) end - +atanh(z::Complex) = atanh(float(z)) diff --git a/test/complex.jl b/test/complex.jl index 0bf7616387bb2..bd50c93e117c1 100644 --- a/test/complex.jl +++ b/test/complex.jl @@ -495,7 +495,7 @@ # atanh # atanh(conj(z)) = conj(atanh(z)) -# atang(-z) = -atanh(z) +# atanh(-z) = -atanh(z) @test isequal(atanh(complex( 0.0, 0.0)),complex( 0.0, 0.0)) @test isequal(atanh(complex( 0.0,-0.0)),complex( 0.0,-0.0)) @@ -510,6 +510,7 @@ @test isequal(atanh(complex(-0.0,-Inf)),complex(-0.0,-pi/2)) @test isequal(atanh(complex( 1.0, 0.0)),complex( Inf, 0.0)) +@test isequal(atanh(complex(-1.0, 0.0)),complex(-Inf, 0.0)) @test isequal(atanh(complex( 5.0, Inf)),complex( 0.0, pi/2)) @test isequal(atanh(complex( 5.0,-Inf)),complex( 0.0,-pi/2)) @test isequal(atanh(complex( 5.0, NaN)),complex( NaN, NaN)) @@ -543,7 +544,7 @@ # atan -# atan(z) = -i*tanh(iz) +# atan(z) = -i*atanh(iz) @test isequal(atan(complex( 0.0, 0.0)),complex( 0.0, 0.0)) @test isequal(atan(complex( 0.0,-0.0)),complex( 0.0,-0.0))