[迷信] double の出力書式は "%lf"

この迷信、ないしは事実誤認はあまりにも根が深く、あまりにも多くのプログラマが間違いを犯し続けるため、遂には標準規格の方が折れて、迷信を追認することになったという"暗い歴史"があります。

printf 系の関数で double 型の実引数に対応した書式指定は "%lf" ではなく "%f" が正解です。同様に、"%le""%lg" ではなく、"%e""%g" を使うのが正解です。

この迷信の元になっているのは、ほぼ間違いなく scanf 系関数の書式との混同です。そして、悪いことには、迷信を信じて疑わない人々が、さらにその迷信を部下や後輩や学生に広めているのです。

C/C++の仕様が分かるのであれば、少し考えれば printf 系関数の書式指定が float と double で区別する必要がないことは容易に理解できるはずです。すなわち、可変個実引数は、既定の実引数拡張によって float 型の値は double 型に暗黙的に型変換されるのです。

長年、double の書式指定に "%lf" を使った場合の動作は未定義でしたが、それでも実在する大多数の処理系では"たまたま"うまく動いていたようです。そして、C99では、それを仕様として追認する羽目になりました。

ちなみに、追認される形で仕様になったのは、あくまでもC99の場合です。C99に対応していない処理系はもちろん、C++においても、double に対する "%lf" は、現在もなお「未定義の動作」を引き起こします。

このエントリーを含むはてなブックマーク