小林です。

----- Original Message -----
送信者 : EGUCHI Osamu <eguchi / shizuokanet.ne.jp>
件名 : [ruby-math:00051] Re: NaN


> |結局 VC では 1.0/0.0 と 0.0/0.0 で  Inf と NaN を
> |生成でき,_finite() と _isnan() は正しくこれを評価する
> |ことが分かりました.ただし,1.0/0.0 や 0.0/0.0 は
> |一旦変数に格納して演算し,コンパイラの定数チェックを
> |ごまかす必要はあります.
>
> と言うのが結論のようです。
>
> missing/isnan.c の実装は、isnan() に対して double_ne() を
> 前方参照にすることで、インライン展開を抑止して、
>
> n != n ⇒ false
>
> という WATCOM C の実現上の誤解(バグ?)を避けていました
> が VC には、前方参照なプロシージャをインライン展開する
> 能力があるのでしょうか?
>
> isnan.c から生成されたアセンブラソースではどうでしょうは?>小林さん
>
一応、以下のようになります。
オプティマイズのレベルによって、異なる可能性はありますが
インライン展開はしていないようです。

手元に、 fcomp の仕様が無いので良く分かりませんが、
多分、そのまま比較してしまう?
というと、x86CPUがIEEE準拠ではない?

27:     return n1 != n2;
10002648   fld         qword ptr [ebp+8]
1000264B   fcomp       qword ptr [ebp+10h]
1000264E   fnstsw      ax
10002650   test        ah,40h
10002653   jne         double_ne+2Eh (1000265e)
10002655   mov         dword ptr [ebp-4],1
1000265C   jmp         double_ne+35h (10002665)

小林 茂雄
E-Mail: shigeo / tinyforest.gr.jp
Home Page: http://www.tinyforest.gr.jp