2012-03-07 12 views
73

Dlaczego python daje "błędną" odpowiedź?Jak skalować pierwiastek kwadratowy w pythonie?

x= 16 

sqrt= x**(.5) 
returns 4 

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

Tak, wiem import math i używać sqrt. Ale szukam odpowiedzi na powyższe.

+20

Wypróbuj w Pythonie 3, naprawiono;) –

+2

Oblicz kwadratowy rdzeń w pythonie za pomocą 'import matmy', a następnie' x = math.sqrt (25) ', który przypisze wartość' 5,0' do x. –

+1

Mylący tytuł tam ... – Julian

Odpowiedz

140

sqrt=x**(1/2) robi podział całkowity. 1/2 == 0.

Więc obliczasz x (1/2) w pierwszym przypadku, x (0) w drugim.

To nie jest źle, to odpowiednia odpowiedź na inne pytanie.

+23

"Więc nie jest źle, to właściwa odpowiedź na inne pytanie" - uwielbiam to! - myślę, że mogę rzucić sobie wyzwanie, by częściej używać tego wyrażenia! –

+2

w Pythonie 3.6 masz właściwą odpowiedź na pytanie, które zadałeś. – vwvan

7

/ dokonuje podziału całkowitej w Pythonie 2:

>>> 1/2 
0 

Jeśli jedna z liczb jest pływak, to działa zgodnie z oczekiwaniami:

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

Trzeba napisać: sqrt = x**(1/2.0), inaczej wykonywany jest podział całkowity, a wyrażenie 1/2 zwraca .

To zachowanie jest "normalne" w Pythonie 2.x, natomiast w języku Python 3.x 1/2 oznacza 0.5. Jeśli chcesz, aby twój kod Python 2.x zachowywał się jak 3.x w.r.t. Podział napisz from __future__ import division - wtedy 1/2 oceni na 0.5 i dla kompatybilności wstecznej, 1//2 eill oceni na 0.

A dla przypomnienia, najlepszym sposobem, aby obliczyć pierwiastek kwadratowy to:

import math 
math.sqrt(x) 
+1

+1 za udzielenie odpowiedzi na pytanie z tytułu. –

+1

minus 1 za nieczytanie pytania ... – Merlin

5

Co widzisz jest podział całkowitą. Aby domyślnie uzyskać podział zmiennoprzecinkowy, można przekształcić 1 lub 2 z 1/2 w wartość zmiennoprzecinkową. Można również przekonwertować 1 lub 2 z 1/2.

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

Można użyć numpy obliczyć pierwiastki kwadratowe z tablicami

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

Mam nadzieję, że wymienione poniżej kod będzie odpowiedzieć na to pytanie.

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) 

Pozdrawiam, Ali

1

to może być trochę za późno, aby odpowiedzieć, ale najbardziej prosty i dokładny sposób obliczyć pierwiastek kwadratowy jest metoda Newtona.

Masz numer, na którym chcesz obliczyć pierwiastek kwadratowy (num) i masz przypuszczenie o pierwiastku kwadratowym (estimate). Wartość szacunkowa może być dowolną liczbą większą od 0, ale liczba, która ma sens, znacznie skraca rekurencyjną głębokość wywołania.

new_estimate = (estimate + num/estimate)/2 

Ta linia oblicza dokładniejszy szacunek dla tych 2 parametrów. Możesz przekazać wartość new_estimate do funkcji i obliczyć inny new_estimate, który jest bardziej dokładny niż poprzedni lub możesz dokonać definicji funkcji rekurencyjnej w ten sposób.

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's. Wiemy, że wynik jest pomiędzy 5 a 6.

newtons_method(30,5) 

numer 30 i oszacowanie to 5. Wynik z każdej rekurencyjnych wywołań są:

5.5 
5.477272727272727 
5.4772255752546215 
5.477225575051661 

Ostatni wynik jest najbardziej dokładne obliczenie pierwiastek kwadratowy liczby. Jest to ta sama wartość co wbudowana funkcja math.sqrt().