こんにちは、なかむら(う)です。
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