6章 文字の表示その2

http://www.geocities.jp/ky_webid/c/006.html

第3章の延長線上。

printfの使い方のも少しプラスアルファ。

各種フォーマットの種類とか。

ざーっと読んだので早速練習問題。

問題1

次のprintf関数は\を何個表示させるでしょう。

printf( "\\\n\n\\n\\\\\n\n" );

ベイベー、Cウルトラ初心者の俺からしたらこんなの目を瞑ってても解けるぜ。

\二つでエスケープなので

\\ \n \n \\ n \\ \\ \n \n

てことで4のはず。

解答

あってた。

問題2

次のプログラム(の一部)を、1行に書き直して下さい。

int ans = 10 + 10;
printf( "10 + 10 = %d\n", ans );

ん?一行にすればいいってこと?

printf( "10 + 10 = %d\n", 10 + 10 );

こゆことかな?

解答

一応あってた。

他の答えとして

printf( "10 + 10 = 20\n" );

って確かにそうだけどさ・・・。

問題3

円周率を表すdouble型の変数piを使い、次のように表示させるプログラムを作って下さい。なお、円周率は 3.141592とします。

3
3.14
3.141592

うむ。習ったとおりにやれば大丈夫さ。

int main () {
    float pi = 3.141592;
    
    printf("%.0f\n",pi);
    printf("%.2f\n",pi);
    printf("%f\n",pi);
    
    return 0;
}

でけた。完璧だと思う。

解答
int main() {
    double pi = 3.141592;

    printf( "%.0f\n", pi );
    printf( "%.2f\n", pi );
    printf( "%.6f\n", pi );
    return 0;
}

むぅ。ちょっと違った。こういう場合はdoubleの方がいいのだろうか?

少し調べてみるとこういう記事が。

C言語の浮動小数点数には、float型とdouble型がありますが、この説明からは、float型には何のメリットも無いようでしょう。実際、無いのです。

昔々、数値演算処理をハードウエアで行なうためには、何百万円もの大金を叩いて数値演算ボードというものを購入したものです。貧乏でそれが購入できない人は、浮動小数点演算はソフト的にやっていたため、非常に時間がかかりました。その時代(といっても、たった10年余りの前のことなのですが)、浮動小数点を高精度で行なうことは非常にぜいたくなことで、floatの精度で十分なときは、より時間のかかるdoubleの精度は求めませんでした。その当時は、floatで計算することは、時間の節約にもなりました。

しかし、今では、double以上の精度の演算を行なってくれるチップが数万円で手に入ってしまう時代です。浮動小数点演算を多用するソフトを走らせる場合には、数値演算チップを差し込むのが常識になってしまった今日では、数値演算チップにとって都合の良い型の方が高速になってしまいました。たいていの数値演算チップは、内部的にはdouble型以上の精度を持っているので、double 型のまま計算した方が早くなってしまいました。

現時点でfloat型を使う理由は、float型が4バイトで、double型は2倍の8バイトでメモリを食うため、巨大な配列などを必要とする時に、メモリを倹約するためくらいしか無くなりました。したがって、float型かdouble型か迷うようだったら、無条件にdouble型を選んで大丈夫です。

http://www.kojima-cci.or.jp/fuji/mybooks/cdiag/cdiag.4.4.html

要するに昔はfloatの方が早かったけど時代の流れとともにdoubleで遜色ないというか処理的にはもうdoubleの方が早いのでfloatにしとけってことですかね。

ただ、メモリ使用量という観点から見ればfloatにもメリットがあるといえばあるのでそこに気にするような案件の場合には有効という感じか。なるほどね。