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

>>> On Thu, 11 Feb 1999 22:53:44 +0900, gotoken / math.sci.hokudai.ac.jp (GOTO Kentaro) said:

gotoken> ごとけんです
gotoken> 
gotoken> In message "[ruby-dev:5007] [PATCH] configure w/ isinf() (Re:  10e9999.to_i)"
gotoken>     on 99/02/11, EGUCHI Osamu <eguchi / shizuokanet.ne.jp> writes:
gotoken> 
gotoken> >えぐち@エスアンドイー です。
gotoken> 
gotoken> >configure.in と missing/{isinf,isnan,finite}.c
gotoken> >をこしらえてみました。
gotoken> 
gotoken> >評価をお願いします。>みんなさま。
gotoken> >(autoconf が必要です。)
gotoken> 
gotoken> パッチさんきゅうです.
gotoken> んが,昨晩 990210 をとり損ねて今日 ftp.netlab からとろうと
gotoken> したら,ftp: connect: Connection refused を食らいました(;_;)
gotoken> 
gotoken> >isinf() は 2. に相当しますが isnan() は n != n です。
gotoken> 
gotoken> それでは,ダメみたいです.
gotoken> 
gotoken> In message [ruby-dev:4867]
gotoken> 
gotoken> >double nan()
gotoken> >{
gotoken> >  double a,b,c;
gotoken> >  a = 0.0; b = 0.0; c = a/b;
gotoken> >  return c;
gotoken> >}
gotoken> 
gotoken> >double inf()
gotoken> >{
gotoken> >  double a,b,c;
gotoken> >  a = 1.0; b = 0.0; c = a/b;
gotoken> >  return c;
gotoken> >}
gotoken> 
gotoken> >isnan_p(double x){ return x != x; }
gotoken> 
gotoken> >isinf_p(double x){ return x == x + 1.0; }
gotoken> 
gotoken> >main()
gotoken> >{
gotoken> >  printf(finite(nan()) ? "YES " : "NO ");
gotoken> >  printf(finite(inf()) ? "YES " : "NO ");
gotoken> >  printf(isnan_p(nan()) ? "YES " : "NO ");
gotoken> >  printf(isnan_p(inf()) ? "YES " : "NO ");
gotoken> >  printf(isinf_p(nan()) ? "YES " : "NO ");
gotoken> >  printf(isinf_p(inf()) ? "YES " : "NO ");
gotoken> >  printf("\n")
gotoken> >}
gotoken> 
gotoken> に対して
gotoken> 
gotoken> In message [ruby-dev:4870]
gotoken> 
gotoken> >有馬@FITECです。
gotoken> >「NO NO NO NO YES YES」でした。
gotoken> 
gotoken> とのことですので.

これですが、わたしは、

	0.0 / 0.0 で NaN でなく Inf を生成する

と読んでいました。
、、どうなんでしょうか?

gotoken> # ちなみに sizeof n という書き方は知りませんでした (^^;;
gotoken> # sizeof double と書かないといけないのかと思ってました.

この場合は、 sizeof(double) ですね。

sizeof(型) には括弧が必須ですが、 sizeof 変数 は括弧がいりません。

これを追求すると gcc の typeof になるのですが、ANSIC では
ないので使ってしまうと混乱の元ですね。

gotoken> >また rb_dbl2big() に無限/非数対策をしましたので
gotoken> >
gotoken> >  % ./ruby -e '1e999.to_i'
gotoken> >  /var/tmp//rbX10817:1: warning: Float 1e999 out of range
gotoken> >  /var/tmp//rbX10817:1:in `to_i': Inifinity (ArgumentError)
gotoken> >	  from /var/tmp//rbX10817:1
gotoken> >  % ./ruby -e '-1e999.to_i'
gotoken> >  /var/tmp//rbk10825:1: warning: Float -1e999 out of range
gotoken> >  /var/tmp//rbk10825:1:in `to_i': Inifinity (ArgumentError)
gotoken> >	  from /var/tmp//rbk10825:1
gotoken> >  % ./ruby -e '(1.0%0.0).to_i'
gotoken> >  /var/tmp//rbA10824:1:in `to_i': NaN (ArgumentError)
gotoken> >	  from /var/tmp//rbA10824:1
gotoken> >
gotoken> >となります。(ArgumentError は妥当でないかも、、)
gotoken> 
gotoken> なんでしょうね.RuntimeError の方がいいかも.
gotoken> 新しい例外をつくるなら DomainError かな.

そうですね、
DomainError に一票

	えぐち