〔前の画面〕
〔クリックポイント〕 〔最新の一覧〕
〔全て読んだことにする〕〔全て読んだことにして終了〕 〔終了〕
1534 re(12):logscale での 固定/浮動小数点の表示の切替え |
2007/3/8(木)19:32 - 竹の - nolm01.iee.niit.ac.jp - 897 hit(s)
松田七美男> FreeBSDもLinux同じGNUのlibcを使っているので,
FreeBSD は BSD 由来の printf だと思います。
/usr/src/lib/libc/stdio/vfprintf.c (printf() は実際には vfprintf() を
呼び出している) には
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Chris Torek.
と書かれています。
松田七美男> 0.0001と表示されます.問題は,実際の値が0.0001より僅かに小さい
松田七美男> 値であった場合に,当然指数部は-5ですから,e が用いられるはずで,
松田七美男> かつ,表示文字列も少ないのは仕様上正しいのではないかということです.
私もそんなにこの辺の話に詳しいわけではなくて、今回ちょっと調べてみただけ
なんで、十分おかしな話をしている可能性はありますので、そうでしたらご指摘
ください。
今までの議論や情報から、例えば、Linux では
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char buff[20];
sprintf(buff,"%.2g\n",0.00009999);
puts(buff);
return 0;
}
では、1e-04 と出るんじゃないかと思ったのですが、違うんでしょうか (g の前
の 2 は表示する有効数字の桁数を指しますが、指数表記の場合、下の桁の 0、お
よび小数点も不要な場合は省略されます)。
もちろん、Solaris, FreeBSD (Solaris 9 + gcc-3.4.3, FreeBSD-4.7 +
gcc-3.4.3, FreeBSD-4.11 + 2.95.4, FreeBSD-5.4 + gcc-3.4.2) ではいずれも
0.0001 と出ます。
1e-04 と出るなら、多分 printf のマニュアルと挙動が異なることになりますか
ら、「libc の printf 的には」バグだと思います。printf のマニュアルからす
ると e-04 という表記が出ることはないように読めます。
もちろん心情的に、「%e と %f の短い方を採用する」なら 1e-04 が正しいでし
ょうし、本来はそういう意図で %g は作られたんでしょうが、マニュアルには
「%e と %f の短い方」とは書いてなくて (注)、「指数部が -4 より小さいなら
ば」と書いてありますから、そこからすればバグだと思います。確かに指数部が
-4 でかつ有効数字が 1 桁の場合は、小数点が抜けて %e の方が短くなってしま
って、それは心情的には現在の %g の方がバグなのかも知れませんが、それがマ
ニュアルに書かれている以上、そういう仕様なんだと思うしかないと思います。
だから、「%e と %f の短い方」を実現する書式は現在の %g とは違うものにな
るでしょうから、違うものとして実現するのがいいんじゃないかと思います。
誤解しているようでしたら、遠慮なくご指摘ください。
(注): %g を「%e と %f の短い方を採用する」と説明している C の本も、中に
はあるようです。しかし、K&R 第 2 版では「-4 より小さいなら」と書いてあ
ります。「ANSI C/C++ 辞典」(平林雅英、共立出版) では、丸め誤差の話も交
えながら、色んな場合の例が紹介してありました。
〔ツリー構成〕
┣【1534】 re(12):logscale での 固定/浮動小数点の表示の切替え 2007/3/8(木)19:32 竹の (2501) |
〔前の画面〕
〔クリックポイント〕 〔最新の一覧〕
〔全て読んだことにする〕〔全て読んだことにして終了〕 〔終了〕
※ 『クリックポイント』とは一覧上から読み始めた地点を指し、ツリー上の記事を巡回しても、その位置に戻ることができます.