# HG changeset patch
# User Nils Bruin <nbruin@sfu.ca>
# Date 1312401197 25200
# Node ID f2bb957f257e7e007b5d5bcb7846416fd4d27dc9
# Parent 4fc30672ecde8c0e99ff23ba962c6e54b0b3381a
#11643: make SR<->maxima interface aware of bfloats
diff --git a/sage/interfaces/maxima_lib.py b/sage/interfaces/maxima_lib.py
a
|
b
|
def reduce_load_MaximaLib(): |
956 | 956 | ############################################# |
957 | 957 | |
958 | 958 | import sage.rings.real_double |
| 959 | import sage.rings.real_mpfr |
959 | 960 | import sage.symbolic.expression |
960 | 961 | import sage.functions.trig |
961 | 962 | import sage.functions.log |
… |
… |
cddr=EclObject("cddr") |
971 | 972 | caddr=EclObject("caddr") |
972 | 973 | caaadr=EclObject("caaadr") |
973 | 974 | cadadr=EclObject("cadadr") |
| 975 | caddar=EclObject("caddar") |
974 | 976 | meval=EclObject("meval") |
975 | 977 | NIL=EclObject("NIL") |
976 | 978 | |
… |
… |
def sage_rat(x,y): |
1079 | 1081 | |
1080 | 1082 | mplus=EclObject("MPLUS") |
1081 | 1083 | mtimes=EclObject("MTIMES") |
| 1084 | bigfloat=EclObject("BIGFLOAT") |
| 1085 | simp=EclObject("SIMP") |
1082 | 1086 | rat=EclObject("RAT") |
1083 | 1087 | max_op_dict[mplus]=add_vararg |
1084 | 1088 | max_op_dict[mtimes]=mul_vararg |
… |
… |
def mdiff_to_sage(expr): |
1180 | 1184 | """ |
1181 | 1185 | return max_to_sr(expr.cadr()).diff(*[max_to_sr(e) for e in expr.cddr()]) |
1182 | 1186 | |
| 1187 | def bigfloat_to_sage(expr): |
| 1188 | r""" |
| 1189 | Special conversion rule for BIGFLOAT expressions. |
| 1190 | |
| 1191 | INPUT: |
| 1192 | |
| 1193 | - ``expr`` - ECL object; a Maxima BIGFLOAT expression |
| 1194 | """ |
| 1195 | p=caddar(expr).python() |
| 1196 | m=cadr(expr).python() |
| 1197 | e=caddr(expr).python() |
| 1198 | return sage.rings.real_mpfr.RealField(p)(m*2**(e-p)) |
| 1199 | |
1183 | 1200 | def dummy_integrate(expr): |
1184 | 1201 | r""" |
1185 | 1202 | We would like to simply tie Maxima's integrate to |
… |
… |
special_max_to_sage={ |
1220 | 1237 | mrat : mrat_to_sage, |
1221 | 1238 | mqapply : mqapply_to_sage, |
1222 | 1239 | mdiff : mdiff_to_sage, |
| 1240 | bigfloat: bigfloat_to_sage, |
1223 | 1241 | EclObject("%INTEGRATE") : dummy_integrate |
1224 | 1242 | } |
1225 | 1243 | |
… |
… |
def pyobject_to_max(obj): |
1267 | 1285 | """ |
1268 | 1286 | if isinstance(obj,sage.rings.rational.Rational): |
1269 | 1287 | return EclObject(obj) if (obj.denom().is_one()) else EclObject([[rat], obj.numer(),obj.denom()]) |
| 1288 | elif isinstance(obj,sage.rings.real_mpfr.RealNumber) and obj.prec() != 53: |
| 1289 | s,m,e = obj.sign_mantissa_exponent() |
| 1290 | p = obj.prec() |
| 1291 | return EclObject([[bigfloat,simp,obj.prec()],m,e+p]) |
1270 | 1292 | elif isinstance(obj,sage.rings.number_field.number_field_element_quadratic.NumberFieldElement_quadratic) and obj.parent().defining_polynomial().list() == [1,0,1]: |
1271 | 1293 | re, im = obj.list() |
1272 | 1294 | return EclObject([[mplus], pyobject_to_max(re), [[mtimes], pyobject_to_max(im), max_i]]) |