logaritmo libreria descargar built python math exponentiation

libreria - pow python



Exponenciación en Python: ¿debería preferir** operator en lugar de math.pow y math.sqrt? (2)

Incluso en Python base puede hacer el cálculo en forma genérica

result = sum(x**2 for x in some_vector) ** 0.5

x ** 2 seguramente no es un truco y el cálculo realizado es el mismo (lo comprobé con el código fuente de cpython). De hecho, lo encuentro más legible (y la legibilidad cuenta).

Usar en su lugar x ** 0.5 para tomar la raíz cuadrada no hace exactamente los mismos cálculos que math.sqrt ya que el primero (probablemente) se calcula usando logaritmos y el último (probablemente) usando la instrucción numérica específica del procesador matemático.

A menudo uso x ** 0.5 simplemente porque no quiero agregar math solo para eso. Sin embargo, esperaría una instrucción específica para que la raíz cuadrada funcione mejor (con mayor precisión) que una operación de varios pasos con logaritmos.

Esta pregunta ya tiene una respuesta aquí:

En mi campo, es muy común cuadrar algunos números, operarlos juntos y tomar la raíz cuadrada del resultado. Esto se hace en el teorema de Pitágoras, y el cálculo de RMS, por ejemplo.

En numpy, he hecho lo siguiente:

result = numpy.sqrt(numpy.sum(numpy.pow(some_vector, 2)))

Y en python puro algo como esto sería esperado:

result = math.sqrt(math.pow(A, 2) + math.pow(B,2)) # example with two dimensions.

Sin embargo, he estado usando esta forma pura de python, ya que la considero mucho más compacta, independiente de la importación y aparentemente equivalente:

result = (A**2 + B**2)**0.5 # two dimensions result = (A**2 + B**2 + C**2 + D**2)**0.5

He escuchado que algunas personas argumentan que el operador ** es una especie de hack, y que cuadrar un número exponiéndola por 0.5 no es tan legible. Pero lo que me gustaría preguntar es si:

"¿Hay alguna razón COMPUTACIONAL para preferir las dos alternativas anteriores a la tercera (s)?"

¡Gracias por leer!


math.sqrt es la implementación C de la raíz cuadrada y, por lo tanto, es diferente de usar el operador ** que implementa la función pow incorporada de Python. Por lo tanto, usar math.sqrt realidad da una respuesta diferente que usar el operador ** y de hecho existe una razón computacional para preferir la implementación del módulo numpy o math sobre el built-in. Específicamente, las funciones sqrt probablemente se implementen de la manera más eficiente posible, mientras que ** opera en un gran número de bases y exponentes y probablemente no esté optimizado para el caso específico de la raíz cuadrada. Por otro lado, la función pow incorporada maneja algunos casos adicionales como "números complejos, potencias enteras ilimitadas y exponenciación modular".

Consulte esta pregunta sobre desbordamiento de pila para obtener más información sobre la diferencia entre ** y math.sqrt .

En términos de cuál es más "Pythonic", pienso que necesitamos discutir la misma definición de esa palabra. Del glosario oficial de Python , se establece que una pieza de código o idea es Pythonic si "sigue de cerca los modismos más comunes del lenguaje Python, en lugar de implementar código usando conceptos comunes a otros idiomas". En cada uno de los otros idiomas en los que puedo pensar, hay algún módulo matemático con funciones básicas de raíz cuadrada. Sin embargo, hay idiomas que carecen de un operador de energía como ** por ejemplo, C ++. Así que ** es probablemente más Pythonic, pero si objetivamente es mejor o no depende del caso de uso.