ごとけんです

In message "[ruby-dev:5024] Re: 10e9999.to_i (Re: compare to NaN (Re: call for finite/isnan testers))"
    on 99/02/11, EGUCHI Osamu <eguchi / shizuokanet.ne.jp> writes:

>そうすると frexp() あたりで、生のビット表現をもぎ取ってきて
>検証するしかないのでしょうか?

すくなくとも SunOS では

       The  results  of  frexp()  and modf() are not defined when
       value is an IEEE infinity or NaN.

です.が,先々でビット判定する機会が出て来ることを考えると,
たぶん frexp() 相当の関数を用意して,符号,指数,仮数を得る
のがよいと思います.
rb_frexp(double val, char* sign, long* eptr, long** mprt);

ただ,IEEE の話をしてるので double は 64bit と思っても
まぁいいと思うんですが,memcpy() をつかうなら long,short 
のサイズがいろいろあり得るので実装はやや面倒です.
バイトスワップも含め pack.c に必要な道具はありますが.
ビットフィールドはプロセッサに依存するので使いたくないし.

>double echo(double n) { return n; }
>isnan(double x){ return x != echo(x); } 
>
>とすれば、まぁ殆んど大丈夫だと思いますが、
>もしかして、これでもインライン最適化する程の
>DFA を予想しなければいけないですか?
>そうすると、echo 外部を外部リンケージにするしかないかな。

もし,最適化が問題なら,static でもいいとは思いますが,
少なくとも echo() は curses でよく使われるので紛らわしい
という気もします.wrap() くらいかな.

-- gotoken