こんにちは、なかむら(う)です。

In message "[ruby-dev:23879] Re: Are these comittable?"
    on Jul.12,2004 20:10:35, <ocean / m2.ccsnet.ne.jp> wrote:
| strtod は "INF" じゃなくて "INFINITY" でも無限大として解釈するんですね _no
| これで晴れて問題なくなりました。
| 
| 少し自信がなくなったので、コミットは明日の深夜にします。

strtodはC90の範囲ではそもそも"inf"や"nan"を認識しない(という
か、C90自体がそもそもinfやnanを扱っていない)のですが、C99では
めでたく(?)仕様に取り込まれました。

というわけで、これに従うのがてっとりばやいかな、と思うのです
が、infとnanの件を手っ取り早くまとめると、

(1) 無限大は"INF"・"INFINITY"のいずれかを理解する。
    ただし、大文字小文字は区別しない。
(2) NaNは"NAN"・"NAN(なぞのもじれつ)"を認識する。
    ただし、大文字小文字は区別しない。

となっています。
問題はNaNの「なぞのもじれつ」と書いた部分で、どれだけ規格書を
読んでも理解できないのですが(*1)、この仕様にそれなりに従って
いると期待される某ライブラリでは、英数字や'_'からなる文字列は
受け付け、'.'や(EUC-JPでの)マルチバイト文字なんかは受け付けな
いようです。

*1 私が読んでいるのはJISなので、ISOの原文には問題ないのかもし
   れません。

この「なぞのもじれつ」部分はよくわからんので誰か詳しい人に教
えて頂きたいところですが ^^;、いちおうこういうこともあるとい
うことで紹介だけしておきます。
# C99なんて知ったことか、というのも意見としてアリかも :)


| +    if (strncasecmp(p, "NAN", 3) == 0) {
| +	p += 3;
| +	fraction = 0.0 / 0.0;
| +	goto exit;
| +    }

前回のパッチのときに反応するのを忘れていたのですが、VC++はリ
テラル0(0.0)で除算を行う式をコード中に含めるとエラーとなりま
す。
なので、

  if (strncasecmp(p, "NAN", 3) == 0) {
      double z = 0.0;
      p += 3;
      fraction = 0.0 / z;
      goto exit;
  }

てな感じで変数を経由してコンパイラをごまかしてください orz


それでは。
-- 
U.Nakamura <usa / garbagecollect.jp>
これでごまかされるような最適化でいいの?>MS