From: "U.Nakamura" Date: 2004-07-12T21:25:01+09:00 Subject: [ruby-dev:23881] Re: Are these comittable? こんにちは、なかむら(う)です。 In message "[ruby-dev:23879] Re: Are these comittable?" on Jul.12,2004 20:10:35, 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 これでごまかされるような最適化でいいの?>MS