Come calcolo la radice quadrata in Python?


140

Perché Python dà la risposta "sbagliata"?

x = 16

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

Sì, lo so import mathe uso sqrt. Ma sto cercando una risposta a quanto sopra.


31
Provalo in Python 3, è stato risolto;)
Mark Ransom il

2
Calcola una radice quadrata in python con import mathe x = math.sqrt(25)che assegnerà il valore 5.0a x.
Eric Leschinski,

1
@Merlin - per favore non ripristinare le modifiche al titolo. Rende la domanda più facile da trovare.
ChrisF

2
@ChrisF - è la mia domanda, risolve problemi muliple. Smetti di cambiare il titolo e il contenuto.
Merlin,

Risposte:


246

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

Quindi stai calcolando x (1/2) nella prima istanza, x (0) nella seconda.

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


64
"Quindi non è sbagliato, è la risposta giusta a una domanda diversa" - lo adoro! - Penso che potrei sfidare me stesso ad usare questa frase più spesso!
Thomas Kimber,

6
in Python 3.6 ottieni la risposta giusta alla domanda che hai posto per la prima volta.
vwvan,

2
Il secondo metodo può essere calcolato come:sqrt = x**(float(1)/2)
VM_AI

117

Devi scrivere sqrt = x**(1/2.0):, altrimenti viene eseguita una divisione intera e l'espressione 1/2ritorna 0.

Questo comportamento è "normale" in Python 2.x, mentre in Python 3.x 1/2valuta 0.5. Se vuoi che il tuo codice Python 2.x si comporti come 3.x wrt division write from __future__ import division- quindi 1/2valuterà 0.5e per la retrocompatibilità, 1//2valuterà 0.

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

import math
math.sqrt(x)

24
import math
math.sqrt( x )

È una banale aggiunta alla catena di risposte. Tuttavia, poiché il soggetto è un hit google molto comune, questo merita di essere aggiunto, credo.


11

/ esegue una divisione intera in Python 2:

>>> 1/2
0

Se uno dei numeri è float, funziona come previsto:

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

7

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

from __future__ import division

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

sqrt = x**(1.0/2)

2

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

Hai un numero che vuoi calcolare la sua radice quadrata (num)e hai una supposizione della sua radice quadrata (estimate). La stima può essere qualsiasi numero maggiore di 0, ma un numero sensato 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 il valore new_estimate alla funzione e calcolare un altro new_estimate più accurato del precedente oppure è possibile definire una 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 degli anni '30. Sappiamo che il risultato è tra 5 e 6.

newtons_method(30,5)

il numero è 30 e la stima è 5. Il risultato di ciascuna chiamata ricorsiva sono:

5.5
5.477272727272727
5.4772255752546215
5.477225575051661

L'ultimo risultato è il calcolo più accurato della radice quadrata del numero. Ha lo stesso valore della funzione integrata math.sqrt ().


1

Forse un modo semplice per ricordare: aggiungere un punto dopo il numeratore (o denominatore)

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

0

È possibile utilizzare NumPy per calcolare le radici quadrate delle matrici:

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

1
Questo è un modo più naturale di fare le radici quadrate, ma come risponde alla domanda (è vero che risponde alla domanda nel titolo, ma non alla domanda reale nel corpo (sì, è un brutto titolo))?
Peter Mortensen,

-1

Spero che il codice sotto indicato risponda alla tua domanda.

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) 

Si prega di modificare e aggiungere una breve spiegazione del perché questo funziona. Solo il codice non è molto utile.
wjandrea,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.