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

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

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

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

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

ちなみに、追認される形で仕様になったのは、あくまでもC99以降(C11やC17も含みます)です。C99以降の規格に対応していない処理系はもちろん、C++であればC++11までがdouble型に対する”%lf”は、現在もなお「未定義の動作」を引き起こします。C++14以降ではC99と同様に”%lf”に対応しています。