フィボナッチ数列を100項まで計算しようとするとunsigned long longでもたりないらしい

タイトルのとおり。

#include
#include

int main(int argc, char *argv[])
{
    unsigned long long int a, b, tmp;
    int n, i;

    n = atoi(argv[1]);
    a = 1;
    b = 1;
    for (i = 1; i <= n; i++) {
        printf("%lld\n", a);
        tmp = a + b;
        a = b;
        b = tmp;
    }

    return 0;
 }

実行結果:

takatoh@nightschool $ ./fib 100
1
1
2
3
5
8
13
21
34

(中略)

4660046610375530309
7540113804746346429
12200160415121876738
1293530146158671551
13493690561280548289
14787220707439219840
9834167195010216513
6174643828739884737
16008811023750101250
3736710778780434371

最後のほうで桁が少なくなったり、明らかにおかしな数値になってしまう。

試しに Ruby でやってみた。

def fib(n)
  a = b = 1
  1.upto(n) do |i|
    puts a
    a, b = b, a + b
  end
end

fib(ARGV[0].to_i)
takatoh@nightschool $ ruby fib.rb 100
1
1
2
3
5
8
13
21
34

(中略)

4660046610375530309
7540113804746346429
12200160415121876738
19740274219868223167
31940434634990099905
51680708854858323072
83621143489848422977
135301852344706746049
218922995834555169026
354224848179261915075

ちゃんと計算できてる! Ruby すげー!

Popでエラーを知らせるにはどうする?

気がつけば1か月もあいだが開いてしまった。

さて、その1か月前のコードを眺めていて気がついたんだけど、スタックから Pop しようとしたとき、スタックが空だったらエラーになってほしい。けど、どうやったら呼び出し側にエラーを伝えられるんだろう?
Pop() の返り値でエラーを伝えることは出来ない。返り値は int 型のどんな値でも有効だから。
調べてみると errno というグローバル変数(?) に値を設定しておく、というやり方があって errno の値(整数値)でどんなエラーかを知らせるようだけど、Pop() のエラーに対応するような errno の値がない。勝手に作ってもいいもんだろうか。