@@ -196,14 +196,21 @@ cdef class arb(flint_scalar):
196196 arb_clear(self .val)
197197
198198 def __init__ (self , mid = None , rad = None ):
199+ cdef arf _rad
200+ cdef fmpz man, exp
199201 if mid is not None :
200202 if arb_set_python(self .val, mid, 1 ) == 0 :
201203 raise TypeError (" cannot create arb from type %s " % type (mid))
202204 if rad is not None :
203- rad = arb(rad)
204- arb_add_error(self .val, (< arb> rad).val)
205- # rad = arf(rad)
206- # arb_add_error_arf(self.val, (<arf>rad).val)
205+ if isinstance (rad, arb):
206+ rad = rad.man_exp()
207+ _rad = arf(rad)
208+ if _rad.is_finite():
209+ # Set the radius exactly so that eval(a.repr()) round trips.
210+ man, exp = _rad.man_exp()
211+ mag_set_fmpz_2exp_fmpz(arb_radref(self .val), man.val, exp.val)
212+ else :
213+ arb_add_error_arf(self .val, _rad.val)
207214
208215 cpdef bint is_zero(self ):
209216 return arb_is_zero(self .val)
@@ -385,10 +392,17 @@ cdef class arb(flint_scalar):
385392 else :
386393 return (0 , man, int (exp), man.bit_length())
387394
395+ # Make this a public function?
396+ cdef tuple _to_arfs(self ):
397+ cdef arf mid = arf.__new__ (arf)
398+ cdef arf rad = arf.__new__ (arf)
399+ arf_set(mid.val, arb_midref(self .val))
400+ arf_set_mag(rad.val, arb_radref(self .val))
401+ return (mid, rad)
402+
388403 def repr (self ):
389- mid = self .mid()
390- rad = self .rad()
391- if rad.is_zero():
404+ mid, rad = self ._to_arfs()
405+ if rad.is_zero() or mid.is_nan():
392406 return " arb(%s )" % mid._repr_str()
393407 else :
394408 return " arb(%s , %s )" % (mid._repr_str(), rad._repr_str())
0 commit comments