2012-03-07 270 views
73

¿Por qué Python da la respuesta "incorrecta"?Cómo calcular la raíz cuadrada en python?

x= 16 

sqrt= x**(.5) 
returns 4 

sqrt= x**(1/2) 
returns 1 

Sí, sé import math y utilizar sqrt. Pero estoy buscando una respuesta a lo anterior.

+20

Pruébalo en Python 3, se soluciona;) –

+2

Calcula una raíz cuadrada en python con 'import math' y luego' x = math.sqrt (25) 'que asignará el valor' 5.0' a x. –

+1

título engañoso allí ... – Julian

Respuesta

140

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

Así que estás x (1/2) en primera instancia de computación, X (0) en el segundo.

Así que no está mal, es la respuesta correcta a una pregunta diferente.

+23

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

+2

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

7

/ realiza una división entera en Python 2:

>>> 1/2 
0 

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

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

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

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

Y para que conste, la forma preferida para calcular una raíz cuadrada es la siguiente:

import math 
math.sqrt(x) 
+1

+1 también para responder la pregunta del título. –

+1

negativo 1 por no leer la pregunta ... – Merlin

5

Lo que están viendo es una división entera. Para llegar división de coma flotante por defecto,

from __future__ import division 

O bien, puede convertir a 1 o 2 de media en un valor de punto flotante.

sqrt = x**(1.0/2) 
-1

Puede utilizar numpy para calcular raíces cuadradas de matrices

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

espero que el código de abajo se menciona a responder a su pregunta.

from __future__ import print_function 

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) 

Saludos, Ali

1

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

Usted tiene un número que quiere calcular su raíz cuadrada (num) y tiene una conjetura de su raíz cuadrada (estimate). La estimación puede ser cualquier número mayor que 0, pero un número que tenga sentido acorta significativamente la profundidad de 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 un nuevo valor estimado a la función y calcular otro nuevo_estimación 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 está entre 5 y 6.

newtons_method(30,5) 

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

5.5 
5.477272727272727 
5.4772255752546215 
5.477225575051661 

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

Cuestiones relacionadas