2012-03-07 18 views
73

Perché python fornisce la risposta "errata"?Come si calcola la radice quadrata in python?

x= 16 

sqrt= x**(.5) 
returns 4 

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

Sì, lo so import math e utilizzare sqrt. Ma sto cercando una risposta a quanto sopra.

+20

Provalo in Python 3, è corretto;) –

+2

Calcola una radice quadrata in python con 'import math' e quindi' x = math.sqrt (25) 'che assegna il valore' 5.0' a x. –

+1

Titolo fuorviante lì ... – Julian

risposta

140

sqrt=x**(1/2) sta facendo divisione integer. 1/2 == 0.

Così si sta calcolando x (1/2) in prima istanza, x (0) nel secondo.

Quindi non è sbagliato, è la risposta giusta a una domanda diversa.

+23

"Quindi non è sbagliato, è la risposta giusta a una domanda diversa" - lo adoro! - Penso che potrei sfidarmi a usare questa frase più spesso! –

+2

in Python 3.6 ottieni la risposta giusta alla domanda che ti sei posta prima. – vwvan

7

/ esegui una divisione intera in Python 2:

>>> 1/2 
0 

Se uno dei numeri è un galleggiante, funziona come previsto:

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

Si deve scrivere: sqrt = x**(1/2.0), tuttavia viene eseguita una divisione intera e l'espressione 1/2 restituisce 0.

Questo comportamento è "normale" in Python 2.x, mentre in Python 3.x 1/2 restituisce 0.5. Se vuoi che il tuo codice Python 2.x si comporti come 3.x w.r.t. divisione scrivere from __future__ import division - quindi 1/2 valuterà a 0.5 e per retrocompatibilità, 1//2 eill valutare a 0.

E per la cronaca, il modo migliore per calcolare una radice quadrata è questo:

import math 
math.sqrt(x) 
+1

+1 per rispondere anche alla domanda dal titolo. –

+1

negativo 1 per non aver letto la domanda ... – Merlin

5

Quello che stai vedendo è divisione intera. Per ottenere la divisione in virgola mobile per impostazione predefinita,

from __future__ import division 

Oppure, è possibile convertire 1 o 2 di 1/2 in un valore in virgola mobile.

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

È possibile utilizzare NumPy per calcolare le radici quadrate di array

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

Spero che il codice qui sotto menzionato sarà rispondere alla tua domanda.

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) 

saluti, Ali

1

Questo potrebbe essere un po 'tardi per rispondere, ma più semplice e più preciso modo di calcolare la radice quadrata è il metodo di Newton.

Si dispone di un numero che si desidera calcolare la radice quadrata (num) e si ha un'ipotesi della sua radice quadrata (estimate). La stima può essere qualsiasi numero maggiore di 0, ma un numero che ha un senso riduce significativamente la profondità della chiamata ricorsiva.

new_estimate = (estimate + num/estimate)/2 

Questa riga calcola una stima più accurata con questi 2 parametri. È possibile passare un nuovo valore alla funzione e calcolare un altro nuovo valore che è più accurato del precedente o è possibile creare una definizione di funzione ricorsiva come questa.

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) 

Ad esempio, dobbiamo trovare la radice quadrata di 30. Sappiamo che il risultato è compreso tra 5 e 6.

newtons_method(30,5) 

numero è 30 e stima è 5. Il risultato di ogni chiamate ricorsive sono:

5.5 
5.477272727272727 
5.4772255752546215 
5.477225575051661 

L'ultimo risultato è il calcolo più accurato di la radice quadrata del numero. È lo stesso valore della funzione built-in math.sqrt().