かとんぼです。

 ょゎさんと、なかむら(う)さんの日記で、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') {

-- 
北島雅博(かとんぼ)