stderrとstdoutについてのあれこれ

printf("hello world")とfprintf(stdout,"hello world")が同じことをしてるのはよく知ってると思います。

じゃあfprintf(stderr,"hello world")との違いは?って聞くと、多分「標準出力と標準エラー出力だから出力先が違う」みたいなこと言われるんですけど、どっちみちディスプレイに出力されるんだから、せいぜい可読性を上げるくらいの意味しかなのかなって思ってたら、ちゃんと使い途がありました。

なにが違うのか

まず1番違うのはリダイレクションやパイプを使った場合で、

(gist)

$ gcc -o hoge hoge.c

$ ./hoge >fuga

うちゅうの

$ cat fuga

ほうそくが みだれる

こんな感じでエラー出力はストレートにリダイレクションすることができません。

エラー出力もリダイレクションされてしまうとエラーメッセージの意味を成さないからですね(多分)

エラー出力をリダイレクション

よく「エラー出力は出力先を変更できない」みたいな記事を読みますが、普通にエラー出力もリダイレクションできます。

$ ./hoge 2>fuga

ほうそくが みだれる

$ cat fuga

うちゅうの

2>[ファイル名]でstderrの出力先を変更できます。

エラー出力と標準出力を合わせてリダイレクションしたい場合はこうします。

$ cat ./hoge >fuga 2>&1 $ cat fuga うちゅうの ほうそくが みだれる

crontabでよくやるけど椅子を投げられるやつ。出力先に/dev/nullを指定すれば出力を捨てられます。

こんな感じでstdoutとstderrでは結構扱いが異なります。 ちなみにC言語ではfreopen()を使えばリダイレクションせずに出力先を変更することもできます。

doubleとfloatの計算速度の話

C言語ではdouble型とfloat型の計算速度に違いがあることを知ったので、その話です。

 

float型の方が速い?

double型は64bitでfloat型は32bitなのだから、普通は精度の低いfloat型の計算の方が速そうな気がしますが、実はdouble型の方が少し速いみたいです。

ならintとlongならlongの方が速いかと言うと、そういうわけではなく普通にintの方が高速です。

 

なぜdoubleの方が速いのか

理由はCPUの構造にあるみたいです。

どうもCPUに乗っている浮動小数点演算ユニットは

double用に作られているので、floatで計算したい場合は1度doubleにキャストして計算した後に再度floatにキャストする必要があるらしく、結果としてdoubleで計算した方が速くなります。

 

 

まあ競プロでは問題になるような差ではないですし、そもそも基本的にdoubleしか使わないので競プロには関係ないですね。