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