2012-03-07 54 views
73

爲什麼python會給出「錯誤」的答案?如何在python中計算平方根?

x= 16 

sqrt= x**(.5) 
returns 4 

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

是的,我知道import math,並使用sqrt。但我正在尋找上述答案。

+20

嘗試在Python 3中,它是固定的;) – 2012-03-07 02:53:38

+2

用'import math'計算python中的平方根,然後用'x = math.sqrt(25)'將x值賦值爲5.0。 – 2016-02-06 15:25:48

+1

那裏有誤導性的標題...... – Julian 2017-07-13 09:47:27

回答

140

sqrt=x**(1/2)正在做整數除法。 1/2 == 0

所以你計算X (1/2)在一審,X (0)第二

所以這沒有錯,它是對不同問題的正確答案。

+23

「所以這沒有錯,它是對另一個問題的正確答案」 - 愛它! - 想想我可能會挑戰自己更頻繁地使用這個詞組! Python 3.6中的 – 2016-04-27 07:50:35

+2

對於你第一次提問的問題,你得到了正確的答案。 – vwvan 2017-04-11 04:40:16

7

/執行在Python 2的整數除法:

>>> 1/2 
0 

如果其中一個號碼是float,它按預期工作:

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

你必須寫:sqrt = x**(1/2.0),否則執行整數除法並且表達式1/2返回0

此行爲在Python 2.x中爲「正常」,而在Python 3.x中,1/2評估爲0.5。如果你希望你的Python 2.x代碼的行爲像3.x w.r.t.分部寫from __future__ import division - 然後1/2將評估爲0.5和向後兼容性,1//2 eill評估爲0

並記錄在案,計算平方根的首選方式是這樣的:

import math 
math.sqrt(x) 
+1

+1也用於回答標題中的問題。 – 2012-03-07 06:01:00

+1

負面的1不讀問題... – Merlin 2015-10-02 03:13:37

5

你看到的是整數除法。爲了得到默認的浮點除法,

from __future__ import division 

或者,你可以將1或2的1/2轉換爲浮點值。

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

您可以使用numpy的計算陣列

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

的平方根我希望下面提到的代碼會回答你的問題。

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) 

問候, 阿里

1

這可能是晚了一點回答,但最簡單而準確的方法來計算平方根是牛頓的方法。

你有一個數字,你想要計算它的平方根(num),你猜它的平方根(estimate)。估計值可以是大於0的任何數字,但有意義的數字會顯着縮短遞歸調用深度。

new_estimate = (estimate + num/estimate)/2 

這條線用這兩個參數計算出更準確的估計值。您可以將new_estimate值傳遞給函數,並計算另一個比前一個更精確的new_estimate,或者可以像這樣做一個遞歸函數定義。

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) 

例如,我們需要找到30的平方根。我們知道,結果是5和6

newtons_method(30,5) 

之間的號碼是30和估計5.每個遞歸調用的結果是:

5.5 
5.477272727272727 
5.4772255752546215 
5.477225575051661 

最後的結果是最準確的計算數字的平方根。它與內置函數math.sqrt()具有相同的值。