@@ -63,43 +63,9 @@ N(a::Integer) = a
6363N (a:: Rational ) = a
6464N (a:: Complex ) = a
6565
66- function N (b:: Basic )
67- if is_a_Integer (b)
68- return _N_Integer (b)
69- elseif is_a_Rational (b)
70- return _N_Rational (b)
71- elseif is_a_RealDouble (b)
72- return _N_RealDouble (b)
73- elseif is_a_RealMPFR (b)
74- return _N_RealMPFR (b)
75- elseif is_a_Complex (b) || is_a_ComplexDouble (b) || is_a_ComplexMPC (b)
76- return complex (N (real (b)), N (imag (b)))
77- elseif isnan (b)
78- return _N_NaN (b)
79- elseif b == oo
80- return Inf
81- elseif b == zoo
82- return Complex (Inf ,Inf )
83- elseif b == PI
84- return π
85- elseif b == EulerGamma
86- return γ
87- elseif b == E
88- return ℯ
89- elseif b == Catalan
90- return catalan
91- elseif b == GoldenRatio
92- return φ
93- else
94- is_constant (b) ||
95- throw (ArgumentError (" Object can have no free symbols" ))
96- out = evalf (b)
97- imag (out) == Basic (0.0 ) ? N (real (out)) : N (out)
98- end
99- end
66+ N (b:: Basic ) = N (b, Val {get_symengine_class(b)} ())
10067
101-
102- function _N_Integer (b:: Basic )
68+ function N (b:: Basic , :: Val{:Integer} )
10369 a = _convert (BigInt, b)
10470 if (a. size > 1 || a. size < - 1 )
10571 return a
@@ -119,12 +85,48 @@ function _N_Integer(b::Basic)
11985end
12086
12187# TODO : conditionally wrap rational_get_mpq from cwrapper.h
122- _N_Rational (b:: Basic ) = Rational (N (numerator (b)), N (denominator (b)))
123- _N_RealDouble (b:: Basic ) = _convert (Cdouble, b)
124- _N_RealMPFR (b:: Basic ) = _convert (BigFloat, b)
125- _N_NaN (b:: Basic ) = NaN
126- _N_ComplexNumber (b:: Basic ) = complex (N (real (b)), N (imag (b)))
88+ N (b:: Basic , :: Val{:Rational} ) = Rational (N (numerator (b)), N (denominator (b)))
89+ N (b:: Basic , :: Val{:RealDouble} ) = _convert (Cdouble, b)
90+ N (b:: Basic , :: Val{:RealMPFR} ) = _convert (BigFloat, b)
91+ N (b:: Basic , :: Val{:NaN} ) = NaN
92+ N (b:: Basic , :: Val{:Complex} ) = complex (N (real (b)), N (imag (b)))
93+ N (b:: Basic , :: Val{:ComplexDouble} ) = complex (N (real (b)), N (imag (b)))
94+ N (b:: Basic , :: Val{:ComplexMPC} ) = complex (N (real (b)), N (imag (b)))
95+
96+ function N (b:: Basic , :: Val{:Infty} )
97+ if b == oo
98+ return Inf
99+ elseif b == zoo
100+ return Complex (Inf ,Inf )
101+ elseif b == - oo
102+ return - Inf
103+ else
104+ throw (ArgumentError (" Unknown infinity symbol" ))
105+ end
106+ end
127107
108+ function N (b:: Basic , :: Val{:Constant} )
109+ if b == PI
110+ return π
111+ elseif b == EulerGamma
112+ return γ
113+ elseif b == E
114+ return ℯ
115+ elseif b == Catalan
116+ return catalan
117+ elseif b == GoldenRatio
118+ return φ
119+ else
120+ throw (ArgumentError (" Unknown constant" ))
121+ end
122+ end
123+
124+ function N (b:: Basic , v)
125+ is_constant (b) ||
126+ throw (ArgumentError (" Object can have no free symbols" ))
127+ out = evalf (b)
128+ imag (out) == Basic (0.0 ) ? N (real (out)) : N (out)
129+ end
128130
129131# # define convert(T, x) methods leveraging N() when needed
130132function convert (:: Type{Float64} , x:: Basic )
0 commit comments