question about math module notation

2 views
Skip to first unread message

brad

unread,
Jul 26, 2007, 3:54:11 PM7/26/07
to
How does one make the math module spit out actual values without using
engineer or scientific notation?

I get this from <code>print math.pow(2,64)</code>:
1.84467440737e+19

I want this:
18,446,744,073,709,551,616

I'm lazy... I don't want to convert it manually :)

Stargaming

unread,
Jul 26, 2007, 4:19:17 PM7/26/07
to

Explicitly converting it to `int` works for me. (Without the 3-digit-
block notation, of course.)

brad

unread,
Jul 26, 2007, 4:24:52 PM7/26/07
to
Stargaming wrote:

> Explicitly converting it to `int` works for me. (Without the 3-digit-
> block notation, of course.)

Thank you!

Paul Rubin

unread,
Jul 26, 2007, 4:28:26 PM7/26/07
to
brad <byte...@gmail.com> writes:
> 18,446,744,073,709,551,616
>
> I'm lazy... I don't want to convert it manually :)

print 2**64

brad

unread,
Jul 26, 2007, 4:49:34 PM7/26/07
to
Paul Rubin wrote:
> print 2**64

Ah yes, that works too... thanks. I've settled on doing it this way:

print int(math.pow(2,64))

I like the added parenthesis :)

Paul Rubin

unread,
Jul 26, 2007, 4:59:12 PM7/26/07
to
brad <byte...@gmail.com> writes:
> Ah yes, that works too... thanks. I've settled on doing it this way:
> print int(math.pow(2,64))
> I like the added parenthesis :)

I was surprised to find that gives an exact (integer, not
floating-point) answer. Still, I think it's better to say 2**64
which also works for (e.g.) 2**10000 where math.pow(2,10000)
raises an exception.

Gary Herron

unread,
Jul 26, 2007, 4:29:39 PM7/26/07
to Stargaming, pytho...@python.org
It's got nothing to do with the math module. Any floating point number,
whether produced by the math module or not, can be converted to a
printable representation using the % operator with a format string:

>>> x = 1.84467440737e+19
>>> x
1.84467440737e+19
>>> print '%25.3f' % x
18446744073699999744.000
>>> print '%12.5e' % x
1.84467e+19
>>> print '%12.5g' % x
1.8447e+19

See http://docs.python.org/lib/typesseq-strings.html for all he details.

Gary Herron


Dan Bishop

unread,
Jul 26, 2007, 8:20:29 PM7/26/07
to
On Jul 26, 3:59 pm, Paul Rubin <http://phr...@NOSPAM.invalid> wrote:

It *is* binary floating point. Powers of 2 are exactly
representable. Of course, it doesn't give an exact answer in general.

>>> int(math.pow(10, 23))
99999999999999991611392L

Paul Rubin

unread,
Jul 26, 2007, 8:29:26 PM7/26/07
to
Dan Bishop <dan...@yahoo.com> writes:
> > I was surprised to find that gives an exact (integer, not
> > floating-point) answer. Still, I think it's better to say 2**64
> > which also works for (e.g.) 2**10000 where math.pow(2,10000)
> > raises an exception.
>
> It *is* binary floating point. Powers of 2 are exactly
> representable. Of course, it doesn't give an exact answer in general.
>
> >>> int(math.pow(10, 23))
> 99999999999999991611392L

Oh yikes, good point. math.pow(2,64) is really not appropriate for
what the OP wanted, I'd say. If you want integer exponentiation, then
write it that way. Don't do a floating point exponentiation that just
happens to not lose precision for the specific example.

>>> int(math.pow(3,50)) # wrong
717897987691852578422784L
>>> 3**50 # right
717897987691852588770249L

Reply all
Reply to author
Forward
0 new messages