Opened 11 years ago

Last modified 8 years ago

#11643 new defect

Maxima precision

Reported by: eviatarbach Owned by: was
Priority: major Milestone: sage-6.4
Component: interfaces Keywords:
Cc: kcrisman, nbruin Merged in:
Authors: Reviewers:
Report Upstream: N/A Work issues:
Branch: Commit:
Dependencies: Stopgaps:

Status badges


The Sage–Maxima interface currently does not maintain precision:

sage: a = RealField(200)(8.987551787368175506591796875e9)
sage: a
sage: var('y')
sage: b = (a * x).mul(y, hold=True)
sage: b
sage: c = (b / (x * y)).simplify()
sage: c
sage: RealField(200)(c)

See here for more details:

Attachments (1)

trac_11643-preliminary.patch (2.5 KB) - added by nbruin 11 years ago.

Download all attachments as: .zip

Change History (9)

comment:1 Changed 11 years ago by kcrisman

  • Cc kcrisman nbruin added

comment:2 Changed 11 years ago by mhansen

There are a couple of issues for this. The first is converting to Maxima which is currently

sage: a._maxima_init_()

should be done with something like: calculus.symbolic_expression_from_string

sage: a._maxima_init_()

Then, there is an issue going from Maxima to Sage. In sage.calculus.calculus.calculus.symbolic_expression_from_string, sage.rings.real_mpfr.create_RealNumber, but does not pass it any precision. This should try and detect the precision of the bigfloat.

Changed 11 years ago by nbruin

comment:3 Changed 11 years ago by nbruin

I have added a patch that can be applied on top of 4.7.1, that tries to preserve precision when translating back and forth between SR and maxima_lib. (not the string-level conversions; only the routines that are now used for integrate and limit). However, it looks like Maxima itself does not try to preserve precision at all with its bigfloats. Any arithmetic defaults to the set precision. So trying to preserve precision is not going to be very useful. At the very least, fpprec should be set appropriately every time. Evidence in the transcript below:

sage: M=sage.calculus.calculus.maxima
sage: from sage.interfaces.maxima_lib import *
sage: a=12345.6789012345678
sage: a.sign_mantissa_exponent()
(1, 868749920300559282, -46)
sage: a.prec()
sage: b=sr_to_max(SR(a))
sage: b
<ECL: ((BIGFLOAT SIMP 60) 868749920300559282 14)>
sage: M(b)
sage: c=M(b)+M(b)
sage: c.ecl()
<ECL: ((BIGFLOAT SIMP 56) 54296870018784955 15)>
sage: sr_to_max(SR(2*a))
<ECL: ((BIGFLOAT SIMP 60) 868749920300559282 15)>

comment:4 Changed 9 years ago by eviatarbach

This is somewhat related to #9263.

comment:5 Changed 9 years ago by jdemeyer

  • Milestone changed from sage-5.11 to sage-5.12

comment:6 Changed 8 years ago by vbraun_spam

  • Milestone changed from sage-6.1 to sage-6.2

comment:7 Changed 8 years ago by vbraun_spam

  • Milestone changed from sage-6.2 to sage-6.3

comment:8 Changed 8 years ago by vbraun_spam

  • Milestone changed from sage-6.3 to sage-6.4
Note: See TracTickets for help on using tickets.