Pythonで平方根を計算するにはどうすればよいですか?


140

Pythonが「間違った」答えを返すのはなぜですか?

x = 16

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

はい、知っimport mathていますsqrt。しかし、私は上記の答えを探しています。


31
Python 3でお試しください。修正されました;)
Mark Ransom

2
Pythonで平方根を計算しimport math、次いで及びx = math.sqrt(25)値を割り当てるれる5.0Xに。
Eric Leschinski、2016

1
@マーリン-タイトルの変更をロールバックしないでください。質問が見つけやすくなります。
ChrisF

2
@ChrisF-その私の質問は、複数の問題に対処しています。タイトルとコンテンツの変更を停止します。
マーリン

回答:


246

sqrt=x**(1/2)整数除算を行っています。1/2 == 0

つまり、最初のインスタンスではx (1/2)2番目のインスタンスではx (0)を計算しています。

だから、それは間違いではなく、別の質問に対する正しい答えです。


64
「それは間違いではない、それは別の質問への正しい答えです」-それを愛しなさい!-私はこのフレーズをもっと頻繁に使うように挑戦するかもしれないと思います!
Thomas Kimber

6
Python 3.6では、最初に尋ねた質問に対する正しい答えが得られます。
vwvan 2017

2
:第二の方法は、のように計算することができるsqrt = x**(float(1)/2)
VM_AI

117

次のように記述する必要があります。sqrt = x**(1/2.0)そうでない場合、整数除算が実行され、式1/2はを返します0

この動作はPython 2.xでは「正常」ですが、Python 3.xではに1/2評価され0.5ます。Python 2.xコードを3.x wrt除算書き込みのように動作させたい場合はfrom __future__ import division1/2に評価され0.5、下位互換性のため1//2にに評価され0ます。

そして記録のために、平方根を計算する好ましい方法はこれです:

import math
math.sqrt(x)

23
import math
math.sqrt( x )

これは、回答チェーンへのささいな追加です。しかし、件名は非常に一般的なグーグルヒットなので、これは追加するに値すると私は信じています。


11

/ Python 2で整数除算を実行します。

>>> 1/2
0

数値の1つが浮動小数点数の場合、期待どおりに機能します。

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

7

表示されているのは整数除算です。デフォルトで浮動小数点除算を取得するには、

from __future__ import division

または、1/2の1または2を浮動小数点値に変換することもできます。

sqrt = x**(1.0/2)

2

これは答えが少し遅いかもしれませんが、平方根を計算する最も簡単で正確な方法はニュートンの方法です。

あなたはその平方根を計算したい数があり(num)、その平方根の推測があります(estimate)。Estimateには0より大きい任意の数を指定できますが、意味のある数を指定すると、再帰呼び出しの深さが大幅に短縮されます。

new_estimate = (estimate + num / estimate) / 2

このラインは、これら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()と同じ値です。


1

おそらく覚えるのに簡単な方法:分子(または分母)の後にドットを追加する

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

0

NumPyを使用して、配列の平方根を計算できます。

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

1
これは平方根を行うためのより自然な方法ですが、質問にどのように答えますか(確かに、タイトルの質問には答えますが、本文の実際の質問には答えません(はい、悪いタイトルです))?
Peter Mortensen

-1

以下のコードがあなたの質問に答えてくれるといいのですが。

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) 

これが機能する理由の簡単な説明を編集して追加してください。コードだけではあまり役に立ちません。
wjandrea
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.