#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:
-------------------------------------------------------------+--------------
Description changed by mstreng:
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
> }}}
> 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'>
> }}}
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)
}}}
--
--
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/13322#comment:1>
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.