sagemath / sage

Main repository of SageMath
https://www.sagemath.org
Other
1.33k stars 453 forks source link

mpmath mpc won't coerce to ComplexNumber #11962

Open 56048686-9665-4c5e-973e-6c3add3aa805 opened 12 years ago

56048686-9665-4c5e-973e-6c3add3aa805 commented 12 years ago

Came across this working on #1173:

sage: version()
'Sage Version 4.7.2.alpha3, Release Date: 2011-09-28'
sage: import mpmath
sage: 
sage: z = mpmath.mpf(2)
sage: z
mpf('2.0')
sage: RR(z)
2.00000000000000
sage: CC(z)
2.00000000000000
sage: 
sage: z = mpmath.mpc(2,3)
sage: z
mpc(real='2.0', imag='3.0')
sage: complex(z)
(2+3j)
sage: CC(z)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
[...]
TypeError: unable to coerce to a ComplexNumber: <type 'sage.libs.mpmath.ext_main.mpc'>

CC: @nexttime

Component: coercion

Issue created by migration from https://trac.sagemath.org/ticket/11962

83660e46-0051-498b-a8c1-f7a7bd232b5a commented 12 years ago
comment:3

A trivial fix would be:


diff --git a/sage/rings/complex_number.pyx b/sage/rings/complex_number.pyx
--- a/sage/rings/complex_number.pyx
+++ b/sage/rings/complex_number.pyx
@@ -148,10 +148,11 @@
             elif isinstance(real, list) or isinstance(real, tuple):
                 re, imag = real
                 real = re
-            elif isinstance(real, complex):
-                real, imag = real.real, real.imag
             else:
-                imag = 0
+                try:
+                    real, imag = real.real, real.imag
+                except AttributeError:
+                    imag = 0
         try:
             R = parent._real_field()
             rr = R(real)

But perhaps there are better ways.

jdemeyer commented 12 years ago

Milestone sage-4.7.3 deleted

sheerluck commented 2 years ago
comment:6
--- a/sage/rings/complex_mpfr.pyx
+++ b/sage/rings/complex_mpfr.pyx
@@ -56,6 +56,7 @@
 from sage.libs.gsl.complex cimport *

 from sage.libs.mpmath.utils cimport mpfr_to_mpfval
+from mpmath import mpc as mpmath_extmpc
 from sage.rings.integer_ring import ZZ

 from sage.misc.superseded import deprecated_function_alias
@@ -961,7 +962,7 @@
             elif isinstance(real, list) or isinstance(real, tuple):
                 re, imag = real
                 real = re
-            elif isinstance(real, complex):
+            elif isinstance(real, (complex, mpmath_extmpc)):
                 real, imag = real.real, real.imag
             elif type(real) is gmpy2.mpc:
                 real, imag = (<gmpy2.mpc>real).real, (<gmpy2.mpc>real).imag
sage: version()
'SageMath version 9.6.beta7, Release Date: 2022-04-02'
sage: import mpmath
sage: z = mpmath.mpc(2, 3)
....: z
mpc(real='2.0', imag='3.0')
sage: complex(z)
(2+3j)
sage: CC(z)
2.00000000000000 + 3.00000000000000*I