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

>>> On Thu, 4 Feb 1999 11:23:57 +0900, WATANABE Hirofumi <watanabe / ase.ptg.sony.co.jp> said:

watanabe> わたなべです.
watanabe> 
watanabe> EGUCHI Osamu <eguchi / shizuokanet.ne.jp> writes:
watanabe> 
watanabe> :matz> |double inf = 1.0 / 0.0;
watanabe> :matz> |double nan = 0.0 / 0.0;
watanabe> :matz> |
watanabe> :matz> |int isinf(x) { return x == inf || x == -inf; }
watanabe> :matz> |int isnan(x) { return x == nan; }
watanabe> :matz> |
watanabe> :matz> |って移植性あるのでしょうか?(特にVC!)
watanabe> :matz> 
watanabe> :matz> Sun方面でDevided by Zeroでエラーになるようです.
watanabe> :
watanabe> :あれ!、ほんとだ、とすると古い cc は全滅?
watanabe> 
watanabe> コンパイラが気を効かせてしまうだけなので
watanabe> 0.0 を変数に代入しとけばいけます.
watanabe> 
watanabe> でも
watanabe> double zero = 0.0;
watanabe> double inf = 1.0 / zero;
watanabe> double nan = zero / zero;
watanabe> は許されないので
watanabe> double zero = 0.0;
watanabe> double inf, nan;
watanabe> init()
watanabe> {
watanabe>     inf = 1.0 / zero;
watanabe>     nan = zero / zero;
watanabe> }
watanabe> みたいに初期化してやる必要があるかな.

この方法が、かなり良さそうですね。

ところで

	int isnan(double x) { return x == nan; }

と定義しても、 isnan(x) は x が何でも(NaN でも) けして
true を返さないです。
NaN とはそういう存在なのですね。

 double nan, inf, zero = 0.0;
 int isNaN(double x)  { return memcmp(&x,&nan,sizeof x) == 0; }

 main()
 {
   inf = 1.0/0.0;
   nan = 0.0 / 0.0;

   printf("%d\n", isNaN(nan));
 }

と言う感じでビットパターンの比較なら一致を返すです。

Ruby の Float のメソッド <=> も NaN 対応が必要でしょう。
具体的には、NaN との大小判別例外を raise するのが良いと思います。

	えぐち

#もっか numberic.c と格闘中につき、今回はパッチなし ^^)l