算額あれこれ

算額問題をコンピュータで解きます

実数を分数で近似

実数 x,0.1 ≦ x ≦ 10 を,近似誤差が最も小さくなるような分数で表せ。
ただし,分子,分母共に 6 桁以内の整数とする。
たとえば,x = 1.618033963166706... の場合は,6765 / 4181 である。

変数名を長くしたので複雑そうに見えるが,実に簡単。for 文を使わず,ベクトル計算でやる。

func2 = function(x) {
  denominator = 1:999999
  numerator = as.integer(x*denominator)
  denominator = rep(denominator, 2)
  numerator = c(numerator, numerator +1)
  is.ok = 999999 >= numerator
  numerator = numerator[is.ok]
  denominator = denominator[is.ok]
  subscript = which.min(abs(x-numerator/denominator))
  cat(numerator[subscript], "/", denominator[subscript])
}

> func2(1.618033963166706)
6765 / 4181