- 2010年にAndreas Lundbladが書いた、もっとも多くコピーされたStackOverflowのスニペットには欠陥がある。
- このスニペットは、バイト数を人間が読みやすい形式で出力する問題の解決策である。たとえば、123,456,789バイトを"123.5 MB"と表現するものだ。
- Lundbladの解決策は、ループの代わりに対数を使って適切な接尾辞(kB、MB、GBなど)を計算する。
- このスニペットは、「GitHubプロジェクトにおけるStack Overflowコードスニペットの使用と帰属表示」という題名の2018年の研究で確認された後、もっとも多くコピーされた。
- 研究では、ほとんどの人がStack Overflowからコードをコピーする際に適切な帰属表示を含めていないことがわかった。
- Lundbladのスニペットの欠陥は、バイト数が1 MBに近づいたときに丸め誤差があることだ。たとえば、999,999バイトを入力すると、正しい"1.0 MB"ではなく"1000.0 kB"が結果として返る。
- Lundbladは、このような問題やほかの極端なケースを処理する修正版コードを提供している。これには、負の入力やdoubleの精度制限が含まれる。
- この記事から得られる主な教訓は、あらゆる極端なケースをテストすることの重要性、浮動小数点演算の複雑さ、そしてコードをコピーする際に適切な帰属表示が必要であることだ。
1件のコメント
Hacker News の意見
if文を使っており、二分探索で単純化できると指摘しています。log()呼び出し、1 回のpow()呼び出し、そしてceil()の使用に疑問を呈し、より単純なアプローチのほうが効果的かもしれないと示唆しています。log演算や整数に適用された除算を使うことは、過度に複雑でバグを招きやすいと批判されています。