えぐち@エスアンドイー です。

>>> In message [ruby-list:19764] Re: build on alpha
    On Tue, 21 Dec 1999 03:36:23 +0900, tokoma / sco.bekkoame.ne.jp (中川 誠) said:

中川> 中川です。
中川> 
中川> In message "[ruby-list:19696] Re: build on alpha"
中川>     on 99/12/20, EGUCHI Osamu <eguchi / shizuokanet.ne.jp> wrote:
中川> 
中川>   > どうやら
中川>   > 	int ee;
中川>   > (3箇所)が問題の様です。
中川>   > 	long ee;
中川>   > が要求されます。
中川> 
中川> さらに症状が悪化しました。0 除算でコアダンプします。
中川> 
中川> fact(4) はまともな値になりますが、fact(40) は 0 になってしまいます。

fact(40) が 0 になるのは、こちらでも再現しました。
[ruby-list:19696] でバグいれてました。すみません。

中川> 会社から出したメールがうまくプロバイダまで届いていなかったので
中川> バックトレースを添付できません。明日までお待ちください。
中川> 
中川> # 1日に1通のペースで齒痒いとは思いますが、ruby-list にまで会社から手を出
中川> # すと収集がつかなくなりそうなので、ご勘弁ください。

私も、出先では ruby-list はチェックしてないです。(仕事しなくなっちゃう)

このペースも、考える時間がたくさんあっていいです。
#だったらつまらないバグだすな!>わたし ^^;;

あと、ちょっと気になったんですが、

  int += short + short

は short が自動昇格されますが、

  long += int + int

は自動昇格されないので、

  long = long + int + int

と書く必要がありそうです。
#手元に long = int の処理系しかないので未確認です。

alpha で、

  #include <stdio.h>
  #include <limits.h>
  long func(int a)
  {
     return a * 2;
  }

  main()
  {
      printf ("%ld\n", func(INT_MAX) / 2);  
  }

は何を表示しますか?

	えぐち


--- bignum.c-bug Mon Dec 20 22:08:44 1999 +++ bignum.c Tue Dec 21 09:54:34 1999 @@ -681,8 +681,8 @@ for (j = 0; j < RBIGNUM(y)->len; j++) { long ee = n + dd * BDIGITS(y)[j]; if (ee) { - zds[i + j] = BIGLO(n); n = zds[i + j] + ee; + zds[i + j] = BIGLO(n); } n = BIGDN(n); }