立方根の計算
Posted feedbacks - Ruby
SICPにあった区間二分法ほとんどそのまま。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | def cube_root(n)
def close_enough?(x, y)
(x - y).abs < 5.0E-13
end
def search(f, negp, posp)
midp = (negp + posp) / 2
if(close_enough?(f.call(midp), 0.0))
return midp
else
test_value = f.call(midp)
case
when test_value > 0
search(f, negp, midp)
when test_value < 0
search(f, midp, posp)
else
midp
end
end
end
def half_interval_method(f, a, b)
a_value = f.call(a)
b_value = f.call(b)
case
when a_value < 0 && b_value > 0
search(f, a, b)
when a_value > 0 && b_value < 0
search(f, b, a)
else
puts "error"
exit
end
end
half_interval_method(lambda{|x| x*x*x - n}, -0.001, n+1)
end
puts "%3.13f" % cube_root(10.0) ** 3# 9.9999999999997
puts "%3.13f" % cube_root(100.0) ** 3# => 99.9999999999999
|


にしお
#3411()
Rating1/1=1.00
ただし、このお題の趣旨は実数区間での探索なので、 立方根関数があっても使ってはいけません。 指数関数と対数関数も禁止します。
Pythonで表現した入出力の例:
[ reply ]