ホーム » 技術 » 平均は7.5です、から始まるfloatの話

平均は7.5です、から始まるfloatの話

元ネタはこちら。

自分が書いたコードはこれ。

#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ってマイニングに使うんじゃないの? とか、あまり前向きな意見は出てこなかった。