printfでdoubleに%lfを使わないといけないというのは嘘だったという話
てきとーにインターネットのウェブサイトを見てたらC言語のprintf関数で%lfは使わないということを知ってしまいました。
[迷信] double の出力書式は “%lf” | 株式会社きじねこ
http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html
C言語。doubleにはfとlfのどちらを使うんですか?教科書にlfと書いてあ… – Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1480134649
c++ – Correct format specifier for double in printf – Stack Overflow
http://stackoverflow.com/questions/4264127/correct-format-specifier-for-double-in-printf
はいはい、インターネットのデマなんでしょ?と言われかねないのでC99(ISO/IEC 9899:1999)を調べると・・・
%lf conversion specifier allowed in printf
どうやらC99になって%lfは認められた模様。
しかし、逆に言えばそれまでは認められていなかったというわけです。
%fと%lfに違いはあるのか
printfではC99でも%fと%lfには違いがありませんでした。
つまり「floatは%f、doubleは%lf」というのはprintfでは間違いです。
1 2 3 4 5 6 7 8 9 10 |
#include <stdio.h> #include <float.h> int main(void) { printf("%f\n", DBL_MAX); printf("%lf\n", DBL_MAX); return 0; } |
1 2 |
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 |
doubleの最大値を%fと%lfで表示させましたがどちらも同じ出力結果となります。
つまり、どちらもdoubleの最大値まで表示できるのでdoubleとして出力されていることが分かります。
ちなみにscanfでは%fと%lfで違いがあります。
floatでは%f、doubleでは%lfを使わないといけません。
http://melpon.org/wandbox/permlink/8npLasGZnWDBnVip
java
javaにもprintfがあり、C言語のprintfと同じように使えます。
javaのprintfで%lfを使うと例外を投げて死にました。
1 2 3 4 5 6 7 |
import java.io.PrintStream; class Main { public static void main(String args[]) { System.out.printf("%lf", 1.0); } } |
1 2 3 4 5 6 7 8 |
Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = 'l' at java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2691) at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2720) at java.util.Formatter.parse(Formatter.java:2560) at java.util.Formatter.format(Formatter.java:2501) at java.io.PrintStream.format(PrintStream.java:970) at java.io.PrintStream.printf(PrintStream.java:871) at Main.main(f.java:5) |