diff --git a/src/numerics.jl b/src/numerics.jl index dad9bf2..422e341 100644 --- a/src/numerics.jl +++ b/src/numerics.jl @@ -151,9 +151,9 @@ function N(b::BasicType) out = evalf(b) imag(out) == Basic(0.0) ? real(out) : out end - -## Conversions SymEngine -> Julia + +## Conversions SymEngine -> Julia function as_numer_denom(x::Basic) a, b = Basic(), Basic() ccall((:basic_as_numer_denom, libsymengine), Nothing, (Ref{Basic}, Ref{Basic}, Ref{Basic}), a, b, x) @@ -175,6 +175,11 @@ imag(x::BasicType{Val{:RealMPFR}}) = Basic(0) imag(x::BasicType{Val{:Rational}}) = Basic(0) imag(x::SymEngine.BasicType) = throw(InexactError()) +# Because of the definitions above, `real(x) == x` for `x::Basic` +# such as `x = symbols("x")`. Thus, it is consistent to define the +# fallback +Base.conj(x::Basic) = 2 * real(x) - x + ## define convert(T, x) methods leveraging N() convert(::Type{Float64}, x::Basic) = convert(Float64, N(evalf(x, 53, true))) convert(::Type{BigFloat}, x::Basic) = convert(BigFloat, N(evalf(x, precision(BigFloat), true))) @@ -203,7 +208,7 @@ isless(x::Basic, y::Basic) = isless(N(x), N(y)) ## These should have support in symengine-wrapper, but currently don't -trunc(x::Basic, args...) = Basic(trunc(N(x), args...)) +trunc(x::Basic, args...) = Basic(trunc(N(x), args...)) trunc(::Type{T},x::Basic, args...) where {T <: Integer} = convert(T, trunc(x,args...)) ceil(x::Basic) = Basic(ceil(N(x))) diff --git a/test/runtests.jl b/test/runtests.jl index 975a775..3b8344d 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -246,3 +246,12 @@ end @test_throws DomainError sin(zoo) @test_throws DomainError sin(oo) @test_throws DomainError subs(sin(log(y - y/x)), x => 1) + +# Some basic checks for complex numbers +@testset "Complex numbers" begin + for T in (Int, Float64, BigFloat) + j = one(T) * IM + @test j == imag(j) * IM + @test conj(j) == -j + end +end diff --git a/test/test-dense-matrix.jl b/test/test-dense-matrix.jl index 5bd7fbd..1fc9a7e 100644 --- a/test/test-dense-matrix.jl +++ b/test/test-dense-matrix.jl @@ -1,9 +1,9 @@ using Test using SymEngine -import LinearAlgebra: lu, det, zeros +import LinearAlgebra: lu, det, zeros, dot CDenseMatrix = SymEngine.CDenseMatrix -@vars x +@vars x y # constructors A = [x 1 2; 3 x 4; 5 6 x] @@ -44,3 +44,6 @@ out = M \ b @test SymEngine.dense_matrix_eye(2,2,0) == Basic[1 0; 0 1] +# dot product +@test dot(x, x) == x^2 +@test dot([1, x, 0], [y, -2, 1]) == y - 2x