かとんぼです。 ょゎさんと、なかむら(う)さんの日記で、mswin32 版の printf によ る NaN の表示がおかしいという指摘がありました。 C:\tmp>ruby -ve "(0..6).each {|i| printf(\"%.*f\n\",i, 0.0/0.0)}" ruby 1.8.1 (2003-12-25) [i386-mswin32] -1 -1.$ -1.#J -1.#IO -1.#IND -1.#IND0 -1.#IND00 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_precision_specification.asp によれば、ランタイム・ライブラリの仕様のようです。 NaN、Inf の扱いがどうあるべきか?という辺り、過去にも議論があっ たようですが、とりあえず、[i386-cygwin]、[i386-freebsd4] などと同 じ出力になるようにしてみたパッチです。 Index: sprintf.c =================================================================== RCS file: /src/ruby/sprintf.c,v retrieving revision 1.34.2.3 diff -u -r1.34.2.3 sprintf.c --- sprintf.c 5 Apr 2004 07:45:13 -0000 1.34.2.3 +++ sprintf.c 28 May 2004 06:32:04 -0000 @@ -690,6 +690,24 @@ char fbuf[32]; fval = RFLOAT(rb_Float(val))->value; +#if defined(_MSC_VER) || defined(__MINGW32__) + { + char *expr; + if (isnan(fval) || isinf(fval)) { + if (isnan(fval)) { + expr = "NaN"; + } + else { + expr = fval < 0 ? "-Inf" : "Inf"; + } + + CHECK(need); + sprintf(&buf[blen], expr); + blen += strlen(&buf[blen]); + break; + } + } +#endif fmt_setup(fbuf, *p, flags, width, prec); need = 0; if (*p != 'e' && *p != 'E') { -- 北島雅博(かとんぼ)