今週、会社で「小数を分数に直すにはどうする?」が話題になった。
■覆水盆にかえらず
本当は分数だったものを一度小数にしてしまうと、その「心」「意味合い」が飛んでしまう。
いいかえると、誤差が入る。
0.33333  が指すものが、
気持ちは 1/3 なのかもしれないし
いえいえ  33333/10000 なのかもしれない。
ということはさておき、小数を分数に直す方法を考察
■10進法
 小数が10進法で表現してあるならば、
  その桁分10の累乗で桁あげすると分数になる
  1.4142 = 14142/100000
 元の小数に対しては誤差なし
■2進法
 プログラムの中のデータは2進法でなりたってることが多い。
 Cのfloat とか double も 中身は2進法
 上の10進法の方法を2進法でやればよいので
 1.0101 = 10101/10000   (ただし、数字は2進数表記)
 分子の一番下のケタの数字が1ならもうそれ以上は約分できない
  下の桁の0を分子分母で同時に削ることで約分できる
 100100/100000 = 1001/1000
■連分数
 最近聞きかじったものに「連分数」がある
 正則連分数の作り方はwikipediaに書いてあった。
 
 http://ja.wikipedia.org/wiki/%E9%80%A3%E5%88%86%E6%95%B0
 連分数の計算方法
 「連分数の方法で近似を高めていって、希望の誤差以下になったらそれを採用する」
 という方法が考えられる。
 これだと、0.33333 ->  1/3 に直す系も構築できる。
 ただし、元の小数に対しては誤差があることになる。
 
	
2進数では1/5も循環小数になる。10011・・・ 
1/101=0.0011001