Home / 別館 Home / Ruby / アルゴリズム / 数値計算
| 掲示板 | Mail |

浮動小数点と数値計算

浮動小数点

基本的な考え方

 Ruby の場合、変数に型という考え方はなく、全てオブジェクトとして表現される。

 とは言いつつ、Numeric クラスには、整数型的なものと浮動小数点型的なものがある。この浮動小数点数は、C 言語で言うところの、double として扱われており、精度は環境に依存する。


僕の環境で各種誤差が発生する状況 (List8-1)
f1 = "0.1"
f2 = "0.000000000000001"
f3 = "0.0000000000000001"

puts "#{f1} + #{f2} = #{f1.to_f + f2.to_f}"
puts "#{f1} + #{f3} = #{f1.to_f + f3.to_f}"

f4 = "1.0000101"
f5 = "1.0000100"

puts "#{f4} - #{f5} = #{f4.to_f - f5.to_f}"
puts "#{f4} + #{f5} = #{f4.to_f + f5.to_f}"


f6 = 1000000.0
f7 = 0.000001
n = 0
while n < 1000000
  f6 += f7
  n += 1
end
puts f6

方程式の解法

 バイナリサーチを使って方程式を解く。例題は、「x5 - 10x4 + 25x3 + 40x2 + 200x - 500 = 0」


方程式の解を求める (List8-8)
def func( x )
  a = (x * x * x * x * x) - (10.0 * x * x * x * x) + (25.0 * x * x * x) + (40.0 * x * x) + (200.0 * x) - 500.0
  return a
end

def binarySearch
  epsilon = 0.00001
  left = 1.0
  right = 3.0
  
  while ((right - left).abs > epsilon) && ((func(left)).abs > epsilon)
    mid = (left + right) / 2.0
    if func(left) * func(mid) >= 0.0
      left = mid
    else
      right = mid
    end
  end
  return left
end

d = binarySearch
puts "方程式の解は #{d}. その時の func(x)は #{func(d)} です"

Home / 別館 Home / Ruby / アルゴリズム / 数値計算
| 掲示板 | Mail |

【参考書籍】
 紀平拓男、春日伸弥 『プログラミングの宝箱 アルゴリズムとデータ構造』(ソフトバンク パブリッシング 2003)
 参考URL:http://www.cmagazine.jp/books/takarabako/

とみくら まさや(vzx01036@nifty.ne.jp) $ Date: 2004/03/02 $