yarv2llvmでサンプルを書きました

yarv2llvmのサンプルを追加しました。自然対数の底を約1000桁求めるというものです。
作っていて色々バグが出たので直しました。引数を渡す順番が違っていて、2つ以上引数を渡すとうまく動かなかったのには我ながら呆れました。

require 'yarv2llvm'
YARV2LLVM::compile_file('sample/e-aux.rb', {:optimize => true, :disasm => false, :dump_yarv =>false})
p compute_e()
#!/bin/env ruby 
# Compute E without bignum
#
KETA = 257

# dst / n -> dst
def div(n, dst)
  i = 0
  r = 0
  while i < KETA do
    d = dst[i] + r * 10000
    r = d % n
    dst[i] = d / n
    i = i + 1
  end
end

def add(src, dst)
  i = KETA - 1
  c = 0
  while i >= 0 do
    t = src[i] + dst[i] + c
    c = t / 10000
    dst[i] = t % 10000
    i = i - 1
  end
end

def compute_e
  i = 0
  f = 1
  a = []
  b = []
  while i < KETA do
    a[i] = 0
    b[i] = 0
    i = i + 1
  end
  b[0] = 1
  a[0] = 0
  n0 = 1 
  while f == 1 do
    f = 0
    i = 0
    while i < KETA do
      if b[i] != 0 then
        f = 1
      end
      i = i + 1
    end
    add(b, a)
    div(n0, b)
    n0 = n0 + 1
  end
  a
end

出力結果(すごい手抜き、改行を手で加えました)

[2, 7182, 8182, 8459, 452, 3536, 287, 4713, 5266, 2497, 7572,
 4709, 3699, 9595, 7496, 6967, 6277, 2407, 6630, 3535, 4759,
 4571, 3821, 7852, 5166, 4274, 2746, 6391, 9320, 305, 9921,
 8174, 1359, 6629, 435, 7290, 334, 2952, 6059, 5630, 7381,
 3232, 8627, 9434, 9076, 3233, 8298, 8075, 3195, 2510, 1901,
 1573, 8341, 8793, 702, 1540, 8914, 9934, 8841, 6750, 9244, 
 7614, 6066, 8082, 2648, 16, 8477, 4118, 5374, 2345, 4424,
 3710, 7539, 777, 4499, 2069, 5517, 276, 1838, 6062, 6133,
 1384, 5830, 75, 2044, 9338, 2656, 297, 6067, 3711, 3200,
 7093, 2870, 9127, 4437, 4704, 7230, 6969, 7720, 9310, 1416,
 9283, 6819, 255, 1510, 8657, 4637, 7211, 1252, 3897, 8442,
 5056, 9536, 9677, 785, 4499, 6996, 7946, 8644, 5490, 5987,
 9316, 3688, 9230, 987, 9312, 7736, 1782, 1542, 4999, 2295,
 7635, 1482, 2082, 6989, 5193, 6680, 3318, 2528, 8693, 9849,
 6465, 1058, 2093, 9239, 8294, 8879, 3320, 3625, 944, 3117,
 3012, 3819, 7068, 4161, 4039, 7019, 8376, 7932, 683, 2823,
 7646, 4804, 2953, 1180, 2328, 7825, 981, 9455, 8153, 175,
 6717, 3613, 3206, 9811, 2509, 9618, 1881, 5930, 4169, 351,
 5988, 8851, 9345, 8072, 7386, 6738, 5894, 2287, 9228, 4998,
 9208, 6805, 8257, 4927, 9610, 4841, 9844, 4363, 4632, 4496,
 8487, 5602, 3362, 4827, 419, 7862, 3209, 21, 6099, 235, 3043,
 6994, 1849, 1463, 1409, 3431, 7381, 4364, 546, 2531, 5209,
 6183, 6908, 8870, 7016, 7683, 9642, 4378, 1405, 9271, 4563,
 5490, 6130, 3107, 2085, 1038, 3750, 5101, 1574, 7704, 1718,
 9861, 687, 3969, 6552, 1267, 1546, 8895, 7035, 354, 212, 3407,
 8498, 1933, 4321, 450]