- if (this->is_integer()) {
- return numeric(*this);
- }
-#ifdef SANE_LINKER
- else if (::instanceof(*value, ::cl_RA_ring)) {
- return numeric(::numerator(The(::cl_RA)(*value)));
- }
- else if (!this->is_real()) { // complex case, handle Q(i):
- cl_R r = ::realpart(*value);
- cl_R i = ::imagpart(*value);
- if (::instanceof(r, ::cl_I_ring) && ::instanceof(i, ::cl_I_ring))
- return numeric(*this);
- if (::instanceof(r, ::cl_I_ring) && ::instanceof(i, ::cl_RA_ring))
- return numeric(::complex(r*::denominator(The(::cl_RA)(i)), ::numerator(The(::cl_RA)(i))));
- if (::instanceof(r, ::cl_RA_ring) && ::instanceof(i, ::cl_I_ring))
- return numeric(::complex(::numerator(The(::cl_RA)(r)), i*::denominator(The(::cl_RA)(r))));
- if (::instanceof(r, ::cl_RA_ring) && ::instanceof(i, ::cl_RA_ring)) {
- cl_I s = ::lcm(::denominator(The(::cl_RA)(r)), ::denominator(The(::cl_RA)(i)));
- return numeric(::complex(::numerator(The(::cl_RA)(r))*(exquo(s,::denominator(The(::cl_RA)(r)))),
- ::numerator(The(::cl_RA)(i))*(exquo(s,::denominator(The(::cl_RA)(i))))));
- }
- }
-#else
- else if (instanceof(*value, ::cl_RA_ring)) {
- return numeric(TheRatio(*value)->numerator);
- }
- else if (!this->is_real()) { // complex case, handle Q(i):
- cl_R r = ::realpart(*value);
- cl_R i = ::imagpart(*value);
- if (instanceof(r, ::cl_I_ring) && instanceof(i, ::cl_I_ring))
- return numeric(*this);
- if (instanceof(r, ::cl_I_ring) && instanceof(i, ::cl_RA_ring))
- return numeric(::complex(r*TheRatio(i)->denominator, TheRatio(i)->numerator));
- if (instanceof(r, ::cl_RA_ring) && instanceof(i, ::cl_I_ring))
- return numeric(::complex(TheRatio(r)->numerator, i*TheRatio(r)->denominator));
- if (instanceof(r, ::cl_RA_ring) && instanceof(i, ::cl_RA_ring)) {
- cl_I s = ::lcm(TheRatio(r)->denominator, TheRatio(i)->denominator);
- return numeric(::complex(TheRatio(r)->numerator*(exquo(s,TheRatio(r)->denominator)),
- TheRatio(i)->numerator*(exquo(s,TheRatio(i)->denominator))));
- }
- }
-#endif // def SANE_LINKER
- // at least one float encountered
- return numeric(*this);
+ if (this->is_integer())
+ return numeric(*this);
+
+ else if (::instanceof(*value, ::cl_RA_ring))
+ return numeric(::numerator(The(::cl_RA)(*value)));
+
+ else if (!this->is_real()) { // complex case, handle Q(i):
+ cl_R r = ::realpart(*value);
+ cl_R i = ::imagpart(*value);
+ if (::instanceof(r, ::cl_I_ring) && ::instanceof(i, ::cl_I_ring))
+ return numeric(*this);
+ if (::instanceof(r, ::cl_I_ring) && ::instanceof(i, ::cl_RA_ring))
+ return numeric(::complex(r*::denominator(The(::cl_RA)(i)), ::numerator(The(::cl_RA)(i))));
+ if (::instanceof(r, ::cl_RA_ring) && ::instanceof(i, ::cl_I_ring))
+ return numeric(::complex(::numerator(The(::cl_RA)(r)), i*::denominator(The(::cl_RA)(r))));
+ if (::instanceof(r, ::cl_RA_ring) && ::instanceof(i, ::cl_RA_ring)) {
+ cl_I s = ::lcm(::denominator(The(::cl_RA)(r)), ::denominator(The(::cl_RA)(i)));
+ return numeric(::complex(::numerator(The(::cl_RA)(r))*(exquo(s,::denominator(The(::cl_RA)(r)))),
+ ::numerator(The(::cl_RA)(i))*(exquo(s,::denominator(The(::cl_RA)(i))))));
+ }
+ }
+ // at least one float encountered
+ return numeric(*this);