Ask Your Question

Why is 3e1 not equivalent to 30?

asked 2012-06-01 00:47:51 -0500

kkumer gravatar image

updated 2015-01-13 14:39:19 -0500

FrédéricC gravatar image

I thought that 3e1 is completely equivalent to 30. However, it is not:

sage: (1/30).n(digits=30)
sage: (1/3e1).n(digits=30)

Then I thought that 3e1 is always 53-bit real number or something like that. But I was wrong again:

sage: 1/3e1.n(digits=30)

Now I am just confused. Is this a bug? If not, how should I understand the second input above, and where can I find it documented? (Sage 5.0)

edit retag flag offensive close merge delete

1 answer

Sort by » oldest newest most voted

answered 2012-06-01 02:23:17 -0500

kcrisman gravatar image

Does this answer it?

sage: type(1/30)
<type 'sage.rings.rational.Rational'>
sage: type(1/3e1)
<type 'sage.rings.real_mpfr.RealNumber'>

In your first thing, you're approximating a rational arbitrarily. In the second, you're approximating the (default 53 bit, I think you're right) "real" number closest to 1/30 with garbage after that many bits, as you suspect.

sage: a = 1/3e1
sage: a
sage: a.prec()
sage: a.n(100)

But in the last one you are doing the same as this, more or less:

sage: b = 3e1
sage: 3e1.n(digits=30)
sage: type(3e1.n(digits=30))
<type 'sage.rings.real_mpfr.RealNumber'>
sage: (3e1.n(digits=30)).prec()
sage: 1/(3e1.n(digits=30))

which seems appropriate to me, since 30 can be represented exactly in binary, but 1/30 can't.

edit flag offensive delete link more


Thanks for the explanation. I was somehow expecting that default 53-bit precision of 3e1 would come into play only when explicit approximation or printout would be requested and not immediately. So, if I define a symbolic function with a single literal constant c=3e8, and I want to be able to choose the precision after calling and getting the output, I have to define this constant as c=300000000. Am I right?

kkumer gravatar imagekkumer ( 2012-06-01 02:56:59 -0500 )edit

Not necessarily - I understand that keeping track of all those zeroes is tricky. Try using `c = Integer(3e8)` instead and see what its type is - this could do what you are looking for.

kcrisman gravatar imagekcrisman ( 2012-06-01 05:52:20 -0500 )edit
Eviatar Bach gravatar imageEviatar Bach ( 2012-06-01 09:55:50 -0500 )edit

c = Integer(3e8) is good enough for me. Tnx.

kkumer gravatar imagekkumer ( 2012-06-05 01:09:33 -0500 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools


Asked: 2012-06-01 00:47:51 -0500

Seen: 362 times

Last updated: Jun 01 '12