Печать очень большой в научной нотации в python
Есть ли способ заставить python печатать чрезвычайно большие длинные ноты в научной нотации? Я говорю о числах порядка 10 ^ 1000 или больше, при таком размере стандартная печать "% e" % num терпит неудачу.
Например:
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print "%e" % 10**100
1.000000e+100
>>> print "%e" % 10**1000
Traceback (most recent call last):
File "", line 1, in
TypeError: float argument required, not long
Похоже, что python пытается преобразовать long в float, а затем распечатать его, возможно ли, чтобы python просто печатал длинную в научной нотации без преобразования его в float?
Ответы
Ответ 1
gmpy на помощь...:
>>> import gmpy
>>> x = gmpy.mpf(10**1000)
>>> x.digits(10, 0, -1, 1)
'1.e1000'
Я смещен, конечно, как оригинальный автор и по-прежнему коммиттер из gmpy
, но я думаю, что он облегчает такие задачи, как этот, который может быть довольно сложным без него (я не знаю простой способ сделать это без какого-либо дополнения, и gmpy
определенно надстройка, которую я бы выбрал здесь: -).
Ответ 2
Не нужно использовать стороннюю библиотеку. Вот решение в Python3, которое работает для больших целых чисел.
def ilog(n, base):
"""
Find the integer log of n with respect to the base.
>>> import math
>>> for base in range(2, 16 + 1):
... for n in range(1, 1000):
... assert ilog(n, base) == int(math.log(n, base) + 1e-10), '%s %s' % (n, base)
"""
count = 0
while n >= base:
count += 1
n //= base
return count
def sci_notation(n, prec=3):
"""
Represent n in scientific notation, with the specified precision.
>>> sci_notation(1234 * 10**1000)
'1.234e+1003'
>>> sci_notation(10**1000 // 2, prec=1)
'5.0e+999'
"""
base = 10
exponent = ilog(n, base)
mantissa = n / base**exponent
return '{0:.{1}f}e{2:+d}'.format(mantissa, prec, exponent)
Ответ 3
Здесь решение, использующее только стандартную библиотеку:
>>> import decimal
>>> x = 10 ** 1000
>>> d = decimal.Decimal(x)
>>> format(d, '.6e')
'1.000000e+1000'
Ответ 4
Попробуйте следующее:
>>> def scientific_notation(v): # Note that v should be a string for eval()
d = Decimal(eval(v))
e = format(d, '.6e')
a = e.split('e')
b = a[0].replace('0','')
return b + 'e' + a[1]
>>> scientific_notation('10**1000')
'1.e+1000'
>>> scientific_notation('10**1000')
'1.e+1000'
>>> sc('108007135253151**1000') # Even handles large numbers
'2.83439e+14033'