が、ここで整理するわずかに異なる方法です論理。コードを読みやすくするために変数名の一部を変更しましたが、使いやすくするために関数に入れました。以下のコードは、Python 2またはPython 3で動作しますが、浮動小数点数の表示方法には若干の違いがあります。
from __future__ import print_function, division
def sqrt_bisect(z, tol=1E-12):
''' Find the square root of `z` by bisection, with tolerance `tol` '''
lo, hi = 0, z
while True:
mid = (lo + hi)/2.0
delta = mid * mid - z
if abs(delta) < tol:
break
if delta > 0:
#Too high
hi = mid
else:
#Too low
lo = mid
return mid
for z in (1, 9, 16, 200):
x = sqrt_bisect(z)
print(z, x, x*x)
出力
1 1.0 0.999999999999
9 3.0 9.0
16 4.0 16.0
200 14.1421356237 200.0
(すなわち出力はPython 2を使用して作成されました)。
ちょうど楽しいので、ここではその機能のよりコンパクトなバリエーションです。
別のlo
とhi
変数を使用して、バイセクシングする間隔の境界を格納する代わりに、このバージョンではbounds
という名前のリストを使用します。文bounds[delta > 0] = mid
は、False
が数値的に0に等しく、True
が1に等しいために機能します。したがって、delta
が正の場合、bounds[delta > 0]
はbounds[1]
に相当します。それは巧妙なトリックですが、はです。あなたがその構築に慣れていない場合は、コードを少し読みにくくしてください。
def sqrt_bisect(z, tol=1E-12):
''' Find the square root of `z` by bisection, with tolerance `tol` '''
bounds = [0, z]
while True:
mid = sum(bounds)/2.0
delta = mid * mid - z
if abs(delta) < tol:
break
bounds[delta > 0] = mid
return mid
次のいずれかの回答が問題を解決する場合は、それを受け入れる必要があります(該当する回答の横にあるチェックマークをクリックしてください)。それは2つのことをします。あなたの問題があなたの満足のために解決されたことを誰にでも知らせることができます。詳しい説明は[here](http://meta.stackexchange.com/a/5235)を参照してください。 –