@@ -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