前田です。

そろそろruby-devへ振ります。
# ほんとはもっと前に振ろうと思ったんですけど忘れてました。

In message "[ruby-list:7057] Re: infinity"
石塚圭樹 <keiju / rational.com> wrote:

|>すでにRubyでInfやNaNが出てくるならFloatで定数定義されていても
|>よいかもしれませんね。
|>(あくまでIEEEのInf/NaNを表現する定数という意味で)
|>BigFloatなどができた場合はどうするかという問題が残りますけど...。
|
|そちらはきっとInfは存在しないはずです. NaNは... この場合は例外かな... 
|
|# 何かおかしいなぁ.... やはり, 例外ベースの方がいいんだろうか...

Floatの時だけNaNが出てくるのはなんとなく変な感じもしますね。

|># ちなみにinspectの表示がおかしいのは前のパッチで直ると思います。
|
|あれれ. パッチ出ていたんですか(^^;;; メイルが多過ぎて全部読み切れてい
|ない...

すみません、[ruby-list:7029]に僕が書いたパッチのことです(^^;
一応、その部分だけ抜き出しておきます。

--- numeric.c.orig	Tue Mar 10 00:49:47 1998
+++ numeric.c	Tue Mar 10 01:39:36 1998
@@ -168,7 +168,7 @@
     char buf[32];
 
     sprintf(buf, "%g", RFLOAT(flt)->value);
-    if (strchr(buf, '.') == 0) {
+    if (finite(RFLOAT(flt)->value) && strchr(buf, '.') == 0) {
 	int len = strlen(buf);
 	char *ind = strchr(buf, 'e');
 

|折衷案はどうでしょう? 計算した結果が, Inf/Nanになったら例外を発生させ
|る. ただし, Inf/Nanを表す定数も用意する.
|
|状態を変数に保存したい時には以下のようにする.
|
|begin
|  y = exp(bignumber)
|rescue PositiveInfError
|  y = Float::PositiveInf
|rescue NegativeInfError
|  y = Float::NegativeInf
|rescue NanError
|  y = Float::Nan
|end
|
|うーん. 使いづらそう...

いっそのことFloatは特別扱いにして(ZeroDivisionErrorも含めて)
例外を上げないようにする、というのも手なのではないでしょうか。

あるいは

Float.raise_infnan_error = true

とした時だけ例外を上げるとか。

-- 
前田 修吾