2014年2月7日金曜日

printf()でdoubleを表示するにはどうするか

printf()でdouble値を表示する時の話。

表示指定はfloat/double共に"%f"である。
doubleはfloatの倍精度だから"%lf"・・・ではない。

でもこれには1つ落とし穴があって、doubleを%fで表示すると精度いっぱいの表示がなされない。%fはfloatの精度7桁までしか表示しないようになっているからだ。

なので、doubleの精度である15桁を表示させるには
    printf("%.15f",d)
のように、小数点以下の表示桁数を指定する必要がある。

ただし、15桁は少数以下だけでなく整数位も含めた全体なので注意。
要するにこの記述も必ずしも正しくはない。
また、これで表示させると累積演算誤差になる部分(小数部は2進数で表しきれないことによる問題)まで表示される。

全体で15桁という指定をするにうまい方法はないかは、X-BASIC for iOSのusingを実装するときに散々考えた。基本方法は以下のとおり。
(1)double値を整数部と小数部に分離する
 modf()関数を使う
(2)整数部をsprintf("%d")で文字列化して、その桁数を数える
    ただし、整数部が0の時は整数部桁数=0とする
(3)小数部の桁数を持つフォーマット文字列を作成する
  sprintf(format,"%%.%df",15-整数部桁数)
(4)それで表示する
 printf("%d",整数部)
 printf(format,小数部)

である。符号も考慮しておかなければならない。

しかし、素直にdoubleを桁数分表示する指定子があればいいと思うのだが、何故無いのだろう?誰も必要としないのだろうか?

0 件のコメント:

コメントを投稿