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 件のコメント:
コメントを投稿