今週、会社で「小数を分数に直すにはどうする?」が話題になった。
■覆水盆にかえらず
本当は分数だったものを一度小数にしてしまうと、その「心」「意味合い」が飛んでしまう。
いいかえると、誤差が入る。
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