From: gotoken@... (GOTO Kentaro) Date: 1999-02-03T16:15:12+09:00 Subject: [ruby-dev:4630] Re: call for finite/isnan testers ごとけんです 趣旨を明確にせずに調査を依頼して、すみません。 今回の主たる目的は、"1e999.to_i" が無限ループに陥ることへ の対処で、[ruby-dev:4553] でまつもとさんが指摘されたように、 「isinf() がどこにでもあるわけではない」という点に対し IEEE 754-1985 で推奨されている finite() ならあるのでは?? という目論見を確かめようと思いました。 # ついでにやはり IEEE 推奨の isnan() も知りたく思いました。 今のところの皆様から寄せられた結果では VC++6.0 には isinf(), isnan() がともにないというのをのぞき、isinf(), isnan() はあるようだという様子です。 isinf() も finite() もない場合に関しては別途対処が必要で、 その他は !isinf() か finite() を使えば、 が無限ループに 陥るバグは回避できます。 isinf() も finite() もない場合にどう対処すべきかは同等の 機能を実現しないといけません。どうも、浮動小数点数の 指数部の特定のビットイメージが NaN や infinity に対応して いるようですが処理系依存です。そのような処理系は僕の手元 にはないのでどなたかお知恵をお貸しください。 -- gotoken % cat > ftest.c #include main() { printf(isnan(0)?"YES ":"NO "); printf(finite(0)?"YES ":"NO "); printf(isnan(1e999)?"YES ":"NO "); /* may be comment out */ printf(finite(1e999)?"YES ":"NO "); /* may be comment out */ printf("\n"); } % gcc -o ftest ftest.c -lm && ./ftest NO YES NO NO % 成功: FreeBSD2.2.6(i386) glibc FreeBSD2.2.8(i386) glibc FreeBSD3.0(i386) glibc Linux2.0.34(i386) glibc SunOS4.1.x(sparc) glibc || cc with /usr/bin/as and /usr/bin/ld SunOS5.6.x(sparc) glibc OSF/1(alpha) cc AIX4.2.1(RS/6000) glibc (gcc2.8.0) LINUX BOX(i386) egcs 1.1 失敗: SunOS5.6(sparc) Sun WorkShop C 4.2 ==> finite, isnan はある AIX4.2.1(RS/6000) C for AIX 3.1 ==> finite, isnan はある VC++6.0 ==> finite, isnan ともになし MacOS(PowerPC) CodeWarrior Pro4 (MW C/C++ v2.2.1 Build 0043) ==> isinf, isnan はある FreeBSD2.2.5(i386) /usr/bin/as ==> isinf, isnan はある SunOS4.1.4+JLE(sparc) Sun CC with /usr/bin/ld, /usr/bin/as) ==> isinf, isnan はある 警告: OSF/1(alpha) line 6: value is outside range representable for type 'double' SunOS5.6(sparc) Sun WorkShop C 4.2 line 6: conversion of floating-point constant to double out of range line 7: conversion of floating-point constant to double out of range AIX4.2.1(RS/6000) C for AIX 3.1 line 6.18: 1506-250 (W) 浮動小数点定数 1e999 は範囲外です。 line 7.19: 1506-250 (W) 浮動小数点定数 1e999 は範囲外です。 VC++6.0 error C2177: 定数が大きすぎます。 error C2177: 定数が大きすぎます。 ^Z