元ネタはこちら。
自分が書いたコードはこれ。
#include <stdio.h> int main(void) { int a = 10; int b = 5; printf("the average of a=10 and b=5 is %.1f\n", (a + b) / 2.0); return 0; }
このコードをネタに、研究所のSlackで盛り上がったのが以下のネタだ。
キャストは必要か?
所員に「floatが好き」という人がいて、floatにキャストすべきではという話が出た。自分のリアクションはこうだ。
- 「/2.0」があるからcastいらないカモ。っていうかfloatにcastしていいんでしたっけ(gccの仕様を確認しないと…)
- (最近のコンパイラはたしかdoubleにキャストするはずだ)
- (最近のコンパイラの%fはたしかdoubleで受けるはずだ)
- (明示的にキャストするのは趣味の問題だが、gccがdoubleで受けるんだったら意味がないんじゃないか)
ということで、man 3 printf を見てみた。案の定%f
はdoubleで受ける仕様だった。なお、sizeof (2.0)
もdoubleなので、ちゃんと暗黙のキャストでdoubleになるから、キャストは不要ということになる。
%fは妥当か?
答えを「7.5」と表示しないといけないのだが、フォーマットはどうあるべきかという話になった。よくあるのが%1.1f
と書いてしまう間違いだ。フォーマットの最初の数字は表示するときの全桁数を指定するので、「7.5」のように3桁で表示したいなら%3.1f
とするか、3は省略してもよい(デフォルトで左詰めになる)。
printfのマニュアルを読んでいてびっくりしたのが、%lf
は廃止になって%Lf
と書かなければならないということだった。いつのまにそんなことに……。
今時floatって必要か?
単精度って必要なの? という議論になったが、よく考えてみると単精度GPUというものが世の中にはあるわけで、単精度コーディングは全盛期を迎えているわけだ。おおっと、うっかりしたことは言えない! しかしgccではfloatで計算するのは非常に面倒なことになりそうだ(油断するとすぐにdoubleにキャストされてしまう)。
ただ、今時のGPUコーディングはPythonを使うんじゃないかな? とか、単精度GPUってマイニングに使うんじゃないの? とか、あまり前向きな意見は出てこなかった。