From: shugo@... (Shugo Maeda) Date: 1998-03-10T19:44:36+09:00 Subject: [ruby-dev:1657] Re: [ruby-list:7057] Re: infinity 前田です。 そろそろruby-devへ振ります。 # ほんとはもっと前に振ろうと思ったんですけど忘れてました。 In message "[ruby-list:7057] Re: infinity" 石塚圭樹 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 とした時だけ例外を上げるとか。 -- 前田 修吾