元ネタはこちら。
自分が書いたコードはこれ。
#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ってマイニングに使うんじゃないの? とか、あまり前向きな意見は出てこなかった。