¿Hay alguna manera de hacer que Python imprima largos extremadamente grandes en notación científica? Estoy hablando de números del orden de 10 ^ 1000 o más, en este tamaño la impresión estándar "% e"% num falla.

Por ejemplo:

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

Parece que Python está tratando de convertir el largo en un flotador y luego imprimirlo, ¿es posible hacer que Python imprima el largo en notación científica sin convertirlo en un flotador?

14
sligocki 7 oct. 2009 a las 09:03

4 respuestas

La mejor respuesta

gmpy al rescate ...:

>>> import gmpy
>>> x = gmpy.mpf(10**1000)
>>> x.digits(10, 0, -1, 1)
'1.e1000'

Soy parcial, por supuesto, como el autor original y sigo cometiendo gmpy, pero creo que facilita tareas como esta que pueden ser una tarea difícil sin ella (no sé un simple manera de hacerlo sin el complemento some , y el gmpy es definitivamente el complemento que elegiría aquí ;-).

17
Alex Martelli 7 oct. 2009 a las 05:14

Prueba esto:

>>> 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'
1
Vin 22 may. 2017 a las 14:09

Aquí hay una solución que usa solo una biblioteca estándar:

>>> import decimal
>>> x = 10 ** 1000
>>> d = decimal.Decimal(x)
>>> format(d, '.6e')
'1.000000e+1000' 
5
Nigel Tufnel 10 may. 2017 a las 17:40

No es necesario usar una biblioteca de terceros. Aquí hay una solución en Python3, que funciona para enteros grandes.

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)
5
Christian Oudard 25 feb. 2010 a las 01:43