えぐち@エスアンドイー です。 >>> 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 に一票 えぐち