えぐち@エスアンドイー です。

>>> On Mon, 1 Feb 1999 08:35:08 +0900, gotoken / math.sci.hokudai.ac.jp (GOTO Kentaro) said:

gotoken> ごとけんです
gotoken> 
gotoken> In message "[ruby-dev:4525] Re: Inf.0"
gotoken>     on 99/01/31, EGUCHI Osamu <eguchi / shizuokanet.ne.jp> writes:
gotoken> 
gotoken> >えぐち@エスアンドイー です。
gotoken> 
gotoken> >認めるとしても、
gotoken> >
gotoken> >  % ruby -e 'p 1e999 == 1e1000 '
gotoken> >  true
gotoken> >
gotoken> >は、見ためにも異常な挙動に思えますので。
gotoken> 
gotoken> あと,1e1000.to_i が無限ループになるという問題もあります.
gotoken> こっちはパッチつけときます.

四則ですら、危ういので、Float が Inf を取り得る
とするとかなり厄介な事がありそうですね。

Inf を認めるとすいると、演算によって発生させる例外も
吟味する必要がありそうですね。

gotoken> >Ruby ソースの parse 中の Inf の生成は
gotoken> >
gotoken> >  エラーにする
gotoken> >  ruby -c な時だけ警告する
gotoken> >
gotoken> >のどちらかがが良いと思います。
gotoken> 
gotoken> パースの段階では分からないと思います.

パッチ付けましたが、リテラルに限っては
この方法で検出出来ると思います。

  % ./ruby -e 'p 9e999'
  /var/tmp//rbu27086:1: Out of range

gotoken> > * to_s に NaN への対策が必要かも知れない。
gotoken> > * Float::Inf が定義されてると、何かの役に立つかも知れない
gotoken> 
gotoken> NaN や Inf を Float に認めるなら to_s も何もしないという
gotoken> のが僕の考えです.Inf.0 というのをヨシと思うのもそのため.
gotoken> あと, NaN や Inf っていつできて,どういうものかは実装依存
gotoken> なんですよね,多分.

『認めるなら to_s も何もしない』と言う意味で Inf.0 と NaN.0 は
Inf と NaN であるべきだと思います。;-)

  Inf.0 の .0 って 1.0 が 1 になっちゃうのを、
  避けるために補っている .0 なんです。

gotoken> うーん数値の実装はわずらわしい.というわけで,
gotoken> IEEE の浮動小数点数がどれくらいどのように実装されてるかの
gotoken> 調査隊募集!!

特に、例外関係の差異が気になりますね。

#ところで、Compaq/alpha ってVAXタイプの浮動小数点は
#cc/gcc からは吐けませんでしたっけ?

	えぐち

--- parse.y.orig Tue Jan 26 19:08:13 1999 +++ parse.y Mon Feb 1 10:01:17 1999 @@ -18,6 +18,8 @@ #include "node.h" #include "st.h" #include <stdio.h> +#include <string.h> +#include <errno.h> /* hack for bison */ #ifdef const @@ -2844,7 +2846,11 @@ pushback(c); tokfix(); if (is_float) { - yylval.val = rb_float_new(atof(tok())); + double d = strtod(tok(), 0); + if (errno == ERANGE) { + yyerror("Out of range"); + } + yylval.val = rb_float_new(d); return tFLOAT; } yylval.val = rb_str2inum(tok(), 10);