Jak obliczyć pierwiastek kwadratowy w Pythonie?


140

Dlaczego Python podaje „złą” odpowiedź?

x = 16

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

Tak, znam import mathi używam sqrt. Ale szukam odpowiedzi na powyższe.


31
Wypróbuj w Pythonie 3, to naprawione;)
Oznacz okup

2
Oblicz pierwiastek kwadratowy w Pythonie za pomocą, import matha następnie, x = math.sqrt(25)który przypisze wartość 5.0do x.
Eric Leschinski

1
@Merlin - proszę nie cofać zmian w tytule. Ułatwia znalezienie pytania.
ChrisF

2
@ChrisF - to moje pytanie, dotyczy wielu zagadnień. Przestań zmieniać tytuł i zawartość.
Merlin

Odpowiedzi:


246

sqrt=x**(1/2)dokonuje dzielenia liczb całkowitych. 1/2 == 0.

Więc obliczasz x (1/2) w pierwszej instancji, x (0) w drugiej.

Więc nie jest źle, to dobra odpowiedź na inne pytanie.


64
„Więc nie jest źle, to dobra odpowiedź na inne pytanie” - uwielbiam to! - myślę, że mógłbym rzucić sobie wyzwanie, aby częściej używać tego wyrażenia!
Thomas Kimber,

6
w Pythonie 3.6 otrzymujesz właściwą odpowiedź na pytanie, które zadałeś jako pierwsze.
vwvan

2
Drugą metodę można obliczyć jako:sqrt = x**(float(1)/2)
VM_AI

117

Musisz napisać sqrt = x**(1/2.0):, w przeciwnym razie następuje dzielenie liczb całkowitych i wyrażenie 1/2zwraca 0.

To zachowanie jest „normalne” w Pythonie 2.x, podczas gdy w Pythonie 3.x 1/2ocenia się jako 0.5. Jeśli chcesz, aby Twój kod Python 2.x zachowywał się jak 3.x wrt Division write from __future__ import division- następnie 1/2oceni do 0.5i dla kompatybilności wstecznej 1//2oceni do 0.

Dla przypomnienia, preferowany sposób obliczania pierwiastka kwadratowego jest następujący:

import math
math.sqrt(x)

23
import math
math.sqrt( x )

To trywialny dodatek do łańcucha odpowiedzi. Jednak ponieważ Temat jest bardzo popularnym hitem w Google, wierzę, że zasługuje na dodanie.


11

/ wykonuje dzielenie liczb całkowitych w Pythonie 2:

>>> 1/2
0

Jeśli jedna z liczb jest liczbą zmiennoprzecinkową, działa zgodnie z oczekiwaniami:

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

7

To, co widzisz, to dzielenie liczb całkowitych. Aby domyślnie uzyskać dzielenie zmiennoprzecinkowe,

from __future__ import division

Lub możesz przekonwertować 1 lub 2 z 1/2 na wartość zmiennoprzecinkową.

sqrt = x**(1.0/2)

2

To może być trochę za późno na odpowiedź, ale najprostszym i dokładnym sposobem obliczenia pierwiastka kwadratowego jest metoda Newtona.

Masz liczbę, dla której chcesz obliczyć jej pierwiastek kwadratowy, (num)i masz przypuszczenie, jaki jest jej pierwiastek kwadratowy (estimate). Oszacowanie może być dowolną liczbą większą niż 0, ale liczba, która ma sens, znacznie skraca głębokość rekurencyjnego połączenia.

new_estimate = (estimate + num / estimate) / 2

Ta linia oblicza dokładniejsze oszacowanie na podstawie tych 2 parametrów. Możesz przekazać wartość new_estimate do funkcji i obliczyć inny new_estimate, który jest dokładniejszy niż poprzedni, lub możesz utworzyć rekurencyjną definicję funkcji, taką jak ta.

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)

Na przykład musimy znaleźć pierwiastek kwadratowy 30. Wiemy, że wynik wynosi od 5 do 6.

newtons_method(30,5)

liczba to 30, a szacunek to 5. Wynik każdego wywołania rekurencyjnego to:

5.5
5.477272727272727
5.4772255752546215
5.477225575051661

Ostatnim wynikiem jest najdokładniejsze obliczenie pierwiastka kwadratowego z liczby. Jest to ta sama wartość, co wbudowana funkcja math.sqrt ().


1

Być może prosty sposób na zapamiętanie: dodaj kropkę po liczniku (lub mianowniku)

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

0

Możesz użyć NumPy do obliczenia pierwiastków kwadratowych z tablic:

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

1
Jest to bardziej naturalny sposób wykonywania pierwiastków kwadratowych, ale jak odpowiada na pytanie (wprawdzie odpowiada na pytanie w tytule, ale nie na rzeczywiste pytanie w treści (tak, to zły tytuł))?
Peter Mortensen

-1

Mam nadzieję, że poniższy kod odpowie na Twoje pytanie.

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) 

Proszę edytować i dodawać krótkie wyjaśnienie dlaczego to działa. Sam kod nie jest zbyt pomocny.
wjandrea
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.