¿Cómo calculo la raíz cuadrada en Python?


140

¿Por qué Python da la respuesta "incorrecta"?

x = 16

sqrt = x**(.5)  #returns 4
sqrt = x**(1/2) #returns 1

Sí, lo sé import mathy lo uso sqrt. Pero estoy buscando una respuesta a lo anterior.


31
Pruébalo en Python 3, está solucionado;)
Mark Ransom

2
Calcule una raíz cuadrada en python con import mathy luego x = math.sqrt(25)que asignará el valor 5.0a x.
Eric Leschinski

1
@Merlin: no revierta los cambios en el título. Hace que la pregunta sea más fácil de encontrar.
ChrisF

2
@ChrisF: es mi pregunta, aborda varios problemas. Deja de cambiar el título y el contenido.
Merlin

Respuestas:


246

sqrt=x**(1/2)está haciendo división entera. 1/2 == 0.

Entonces estás calculando x (1/2) en la primera instancia, x (0) en la segunda.

Entonces no está mal, es la respuesta correcta a una pregunta diferente.


64
"Así que no está mal, es la respuesta correcta a una pregunta diferente" - ¡me encanta! ¡Creo que podría desafiarme a mí mismo para usar esta frase más a menudo!
Thomas Kimber

66
en Python 3.6 obtienes la respuesta correcta a la pregunta que primero hiciste.
vwvan

2
El segundo método se puede calcular como:sqrt = x**(float(1)/2)
VM_AI

117

Debe escribir: de lo sqrt = x**(1/2.0)contrario, se realiza una división entera y la expresión 1/2vuelve 0.

Este comportamiento es "normal" en Python 2.x, mientras que en Python 3.x se 1/2evalúa como 0.5. Si desea que su código Python 2.x se comporte como escritura de división wrt 3.x from __future__ import division, entonces 1/2evaluará 0.5y, para la compatibilidad con versiones anteriores, 1//2evaluará a 0.

Y para el registro, la forma preferida de calcular una raíz cuadrada es esta:

import math
math.sqrt(x)

23
import math
math.sqrt( x )

Es una adición trivial a la cadena de respuesta. Sin embargo, dado que el Asunto es un hit de Google muy común, esto merece ser agregado, creo.


11

/ realiza una división entera en Python 2:

>>> 1/2
0

Si uno de los números es flotante, funciona como se esperaba:

>>> 1.0/2
0.5
>>> 16**(1.0/2)
4.0

7

Lo que estás viendo es la división entera. Para obtener la división de coma flotante por defecto,

from __future__ import division

O bien, puede convertir 1 o 2 de 1/2 en un valor de coma flotante.

sqrt = x**(1.0/2)

2

Esto puede ser un poco tarde para responder, pero la forma más simple y precisa de calcular la raíz cuadrada es el método de Newton.

Tiene un número que desea calcular su raíz cuadrada (num)y puede adivinar su raíz cuadrada (estimate). La estimación puede ser cualquier número mayor que 0, pero un número que tiene sentido acorta significativamente la profundidad de la llamada recursiva.

new_estimate = (estimate + num / estimate) / 2

Esta línea calcula una estimación más precisa con esos 2 parámetros. Puede pasar el valor de new_estimate a la función y calcular otro new_estimate que sea más preciso que el anterior o puede hacer una definición de función recursiva como esta.

def newtons_method(num, estimate):
    # Computing a new_estimate
    new_estimate = (estimate + num / estimate) / 2
    print(new_estimate)
    # Base Case: Comparing our estimate with built-in functions value
    if new_estimate == math.sqrt(num):
        return True
    else:
        return newtons_method(num, new_estimate)

Por ejemplo, necesitamos encontrar la raíz cuadrada de 30. Sabemos que el resultado es entre 5 y 6.

newtons_method(30,5)

el número es 30 y la estimación es 5. El resultado de cada llamada recursiva es:

5.5
5.477272727272727
5.4772255752546215
5.477225575051661

El último resultado es el cálculo más preciso de la raíz cuadrada del número. Es el mismo valor que la función incorporada math.sqrt ().


1

Quizás una forma simple de recordar: agregue un punto después del numerador (o denominador)

16 ** (1. / 2)   # 4
289 ** (1. / 2)  # 17
27 ** (1. / 3)   # 3

0

Puede usar NumPy para calcular raíces cuadradas de matrices:

 import numpy as np
 np.sqrt([1, 4, 9])

1
Esta es una forma más natural de hacer raíces cuadradas, pero ¿cómo responde la pregunta (es cierto que responde la pregunta en el título, pero no la pregunta real en el cuerpo (sí, es un mal título))?
Peter Mortensen

-1

Espero que el código mencionado a continuación responda a su pregunta.

def root(x,a):
    y = 1 / a
    y = float(y)
    print y
    z = x ** y
    print z

base = input("Please input the base value:")
power = float(input("Please input the root value:"))


root(base,power) 

Por favor, editar y añadir una breve explicación de por qué esto funciona. Solo el código no es muy útil.
wjandrea
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.