なぜPythonは「間違った」答えを出すのですか?
x = 16
sqrt = x**(.5)
returns 4
sqrt = x**(1/2)
returns 1
はい、私はimport math
を知っていてsqrt
を使います。しかし、私は上記の答えを探しています。
sqrt=x**(1/2)
は整数除算をしています。 1/2 == 0
。
だからあなたはx(1/2)、x(0)秒で。
それは間違いではありません、それは別の質問に対する正しい答えです。
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
は0
に評価されます。
そしてレコードにとって、平方根を計算するための好ましい方法はこれです:
import math
math.sqrt(x)
import math
math.sqrt( x )
それは答えの連鎖への些細な追加です。しかし、件名は非常に一般的なグーグルヒットであるので、これは追加されるに値します、と私は思います。
/
はPython 2では整数除算を実行します。
>>> 1/2
0
数値の1つが浮動小数点数であれば、それは期待どおりに機能します。
>>> 1.0/2
0.5
>>> 16**(1.0/2)
4.0
あなたが見ているのは整数除算です。デフォルトで浮動小数点除算をするには、
from __future__ import division
または、1/2の1/2を浮動小数点値に変換することもできます。
sqrt = x**(1.0/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)
各再帰呼び出しの結果は次のとおりです。
5.5
5.477272727272727
5.4772255752546215
5.477225575051661
最後の結果は数の平方根の最も正確な計算です。組み込み関数math.sqrt()と同じ値です。
おそらく覚えておくべき簡単な方法:分子(または分母)の後ろにドットを追加する16 **(1./2)#4 289 **(1./2)#17 27 **(1./3)#3
下記のコードがあなたの質問に答えてくれることを願っています。
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)