From: EGUCHI Osamu Date: 1999-02-07T02:57:01+09:00 Subject: [ruby-dev:4794] Re: compare to NaN (Re: Re: call for finite/isnan testers) えぐち@エスアンドイー です。 >>> On Sat, 6 Feb 1999 23:11:29 +0900, matz@netlab.co.jp (Yukihiro Matsumoto) said: matz> まつもと ゆきひろです matz> matz> In message "[ruby-dev:4760] compare to NaN (Re: Re: call for finite/isnan testers)" matz> on 99/02/06, EGUCHI Osamu writes: matz> matz> |えぐち@エスアンドイー です。 matz> matz> | * Float::INFINITY の追加 matz> | * Float::NaN の追加 matz> | * NaN との大小判別例外 NaNCompareError クラスの追加 matz> | * FLoat#infinite? の追加(Inf:正数, -Inf:負数、otherwise false) matz> | * FLoat#nan? の追加(また x == Float::NaN は常に偽) matz> | * FLoat#finte? の追加(Inf, -Inf or NaN:false, otherwise true) matz> | * FreeBSD 環境での浮動小数点関連のトラップの抑止(main.c) matz> matz> 面白いですね.採用に関して前向きなのですが,気になる点がいく matz> つかあります. matz> matz> 仕様について matz> matz> -INFINITYを示す定数は不要か(-Float::INFINITYで十分か) これは、 'Float#-@' が1回ランタイムに 呼ばれるオーバーヘッド以外は、問題ないでしょう、 matz> infinite?, finite?の両方が必要か f.finite? と not f.infinite and not f.nan? は等価なので という枕が付いた上で、 Float#finite? は不要でしょう。 消極的ですが、Cからの移植とい観点ではあっても良いと思います。 #ぢゃ alias に isinf isnan が必要ってわけでもないでしょうが、、 matz> Float::infinite?は真の時に正数,負数を返す仕様は妥当か +/-INFINITY の両方とも true が買えると考えて Ruby で アプリ/ライブラリを書いた人がいても、実害が起こるのは 戻値と true との比較という邪悪なケースに限られるので良いのでは? 趣旨は、無限に正と負がある事を強く意識したかったという事です。 matz> このFloat::INFINITYやFloat::NaNのシステムはごとけんさんの matz> Float抽象クラス化と衝突しないか これは、一番気になるところです。 Float::INFINITYとFloat::NaNの妥当な扱いは、 議論の余地があると思います。 ただ、Float::INFINITYとFloat::NaNを導入しなくても 演算結果に無限と非数は存在しますので、問題は已然として 存在します。 わたしは、 Float抽象クラス化のこころをうまく理解していないので、 見当違いの事を言ってるかも知れません。 ^^;;; matz> 実装について matz> matz> main.cでFreeBSD対応しているが,Init_Numeric()あたりでやる matz> べきでは? いや,そうするとRubyをlinkしたアプリケーション matz> すべてに強制することになるか…. Init_Numeric() は全てのパーズより前に呼ばれますよね、 それなら、問題ないと思いますが、精度を失うと core を吐くのは 望ましい挙動とは誰も思わないので、main() でやっても良いのでは? matz> isinf(),isnan()の移植性をどうするか.ごとけんさんの調査待 matz> ちか. そうですね、isinf(), isnan(), finite() を多用してますので、 VC では現状動きませんね。より移植性の高い方法を、ごとけんさんを 手伝って模索したいと思います。 matz> 1.0/0.0でInfを0.0/0.0でNaNを作っているが移植性は? ごとけんさんの調査によると、ヤバげなプラットホームもありますね。 * configure.in でテスト/生成する * バイナリパターンを埋め込む などが考えられます。 matz> static double infinity, nan, zero = 0.0;のstaticはいらない matz> んじゃない? これは気の迷いです。 というか、自前の isinf() を作ろうとした名残です。 おっしゃる通り static は不要です。 matz> flo_infinite_p()で+1, -1を返してるが,これはINT2FIX()でく matz> くるべきだと思う. をぉ、稚拙なミスを侵してしまいました。 ^^;; matz> 数値に強い方の登場をお待ちしています. 同感です。 matz> まつもと ゆきひろ /:|) matz> p.s. matz> 数値に強いってのと数学に強いってのはまた違うんだよな.私はどっ matz> ちにも弱いけど. 浮動小数点演算ってコンピュータの暗黒面だと思う。 (@@) えぐち