#13322: Precision loss when converting between Magma and Sage
-------------------------------------------------------------+--------------
       Reporter:  mstreng                                    |         Owner:  
was     
           Type:  defect                                     |        Status:  
new     
       Priority:  major                                      |     Milestone:  
sage-5.3
      Component:  interfaces                                 |    Resolution:   
       
       Keywords:  magma numerical real precision truncation  |   Work issues:   
       
Report Upstream:  N/A                                        |     Reviewers:   
       
        Authors:                                             |     Merged in:   
       
   Dependencies:                                             |      Stopgaps:   
       
-------------------------------------------------------------+--------------

Old description:

> There is a significant amount of precision loss when converting Magma
> real numbers to Sage or Sage real numbers to Magma.
> {{{
> sage: s = RealField(1000)(1/3)
> sage: m = magma(RealField(1000))(1/3)
> sage: s
> 0.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
> sage: m
> 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
> sage: magma(s)
> 0.3333333333333333333333333333334648101508701686342352880942137977049455344058515038341283798217773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
> sage: m.sage()
> 0.333333333333333314829616256247390992939472198486328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
> }}}
> From Sage to Magma, this is because the interface goes via 30 digit
> precision Magma {{{FldReElt}}}:
> {{{
> sage: s = RealField(300)(1/3)
> sage: s
> 0.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
> sage: magma(s)
> 0.333333333333333333333333333333464810150870168634235288094213797704945534405851503834128380
> sage: s._magma_init_(magma)
> 'RealField(300 : Bits :=
> true)!0.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'
> sage:
> magma('0.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333')
> 0.333333333333333333333333333333
> sage:
> magma('0.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333').Type()
> FldReElt
> sage:
> magma('0.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333').Precision()
> 30
> }}}
> Solution:
> {{{
> Magma V2.17-6     Wed Aug  1 2012 15:22:07 on dhcp-173-244 [Seed =
> 509043312]
> Type ? for help.  Type <Ctrl>-D to quit.
> >
> 0.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;
> 0.333333333333333333333333333333
> >
> 0.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333p100;
> 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
> }}}
>
> From Magma to Sage, this is because the interface goes via Python floats:
> {{{
> sage: m = magma(RealField(200))(1/3); m
> 0.333333333333333333333333333333333333333333333333333333333333
> sage: m.sage()
> 0.33333333333333331482961625624739099293947219848632812500000
> sage: str(m.Sage())
> 'RealField(200)(0.333333333333333333333333333333333333333333333333333333333333)'
> 0.33333333333333331482961625624739099293947219848632812500000
> sage: sage_eval(str(m.Sage()))
> 0.33333333333333333333333333333333333333333333333333333333333
> sage: sage_eval(str(m.Sage()), preparse=False)
> 0.33333333333333331482961625624739099293947219848632812500000
> sage: type(sage_eval('0.3333333333333333333333333333333333333333333',
> preparse=False))
> <type 'float'>
> }}}
> Solution: change "false" to "true" in the following.
> {{{
> sage: m.Sage(nvals=2)
> (RealField(200)(0.333333333333333333333333333333333333333333333333333333333333),
> false)
> }}}

New description:

 There is a significant amount of precision loss when converting Magma real
 numbers to Sage or Sage real numbers to Magma.
 {{{
 sage: s = RealField(1000)(1/3)
 sage: m = magma(RealField(1000))(1/3)
 sage: s
 
0.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
 sage: m
 
0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
 sage: magma(s)
 
0.3333333333333333333333333333334648101508701686342352880942137977049455344058515038341283798217773437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 sage: m.sage()
 
0.333333333333333314829616256247390992939472198486328125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 }}}
 From Sage to Magma, this is because the interface goes via 30 digit
 precision Magma {{{FldReElt}}}:
 {{{
 sage: s = RealField(300)(1/3)
 sage: s
 
0.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
 sage: magma(s)
 
0.333333333333333333333333333333464810150870168634235288094213797704945534405851503834128380
 sage: s._magma_init_(magma)
 'RealField(300 : Bits :=
 
true)!0.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'
 sage:
 
magma('0.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333')
 0.333333333333333333333333333333
 sage:
 
magma('0.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333').Type()
 FldReElt
 sage:
 
magma('0.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333').Precision()
 30
 }}}
 Solution:
 {{{
 Magma V2.17-6     Wed Aug  1 2012 15:22:07 on dhcp-173-244 [Seed =
 509043312]
 Type ? for help.  Type <Ctrl>-D to quit.
 >
 
0.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333;
 0.333333333333333333333333333333
 >
 
0.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333p100;
 
0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
 }}}

 From Magma to Sage, this is because the interface goes via Python floats:
 {{{
 sage: m = magma(RealField(200))(1/3); m
 0.333333333333333333333333333333333333333333333333333333333333
 sage: m.sage()
 0.33333333333333331482961625624739099293947219848632812500000
 sage: str(m.Sage())
 
'RealField(200)(0.333333333333333333333333333333333333333333333333333333333333)'
 0.33333333333333331482961625624739099293947219848632812500000
 sage: sage_eval(str(m.Sage()))
 0.33333333333333333333333333333333333333333333333333333333333
 sage: sage_eval(str(m.Sage()), preparse=False)
 0.33333333333333331482961625624739099293947219848632812500000
 sage: type(sage_eval('0.3333333333333333333333333333333333333333333',
 preparse=False))
 <type 'float'>
 }}}
 Solution: change "false" to "true" in the following.
 {{{
 sage: m.Sage(nvals=2)
 
(RealField(200)(0.333333333333333333333333333333333333333333333333333333333333),
 false)
 }}}

 Apply

  * [attachment:13322.patch] to devel/sage
  * [attachment:13322-extcode.patch] to data/extcode

--

Comment (by mstreng):

 I still need to run some tests before this is ready to be reviewed.

-- 
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/13322#comment:2>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica, 
and MATLAB

-- 
You received this message because you are subscribed to the Google Groups 
"sage-trac" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sage-trac?hl=en.

Reply via email to