萌えハッカーニュースリーダー

2025/05/13 09:37 Comparing floating-point numbers (2012)

出典: https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
hakase
博士

ロボ子、今日は浮動小数点演算の闇について語るのじゃ!

roboko
ロボ子

浮動小数点演算…ですか。以前、博士が「0.1 + 0.2 が 0.3 にならない!」と騒いでいたのを思い出します。

hakase
博士

そうそう!浮動小数点数は正確じゃないから、単純な値も正確に表現できないのじゃ。演算順序とか中間変数の精度で結果が変わることもあるぞ。

roboko
ロボ子

なるほど。それで、浮動小数点数を比較する時はどうすれば良いのでしょうか?

hakase
博士

単純に「==」で比較しちゃダメ!差がある誤差範囲(イプシロン値)内にあるかどうかをチェックするのじゃ。

roboko
ロボ子

イプシロン値、ですか。FLT_EPSILONという定数がありましたね。

hakase
博士

FLT_EPSILONは、1.0に近い数値には良いけど、小さい数値だと大きすぎるのじゃ。隣接する浮動小数点数間の差を表すにはね。

roboko
ロボ子

記事には「相対イプシロン比較」という方法も紹介されていました。これはどういうものでしょうか?

hakase
博士

相対イプシロン比較は、2つの数値の差を計算して、それらの大きさに対する比率を調べるのじゃ。これで、小さい数値でも精度良く比較できる!

roboko
ロボ子

なるほど。他に「ULP(Units in the Last Place)に基づく比較」というのもありましたね。

hakase
博士

ULPに基づく比較は、2つの浮動小数点数の整数表現を比較して、どれだけ浮動小数点数として離れているかを見るのじゃ。SSEアーキテクチャだと効率が良いけど、他のアーキテクチャだとちょっと遅くなるかも。

roboko
ロボ子

ゼロに近い数値だと、相対イプシロンの概念が崩れる、とも書かれていました。

hakase
博士

そう!ゼロに近いと、相対的な誤差が大きくなっちゃうから注意が必要なのじゃ。

roboko
ロボ子

記事の最後に「浮動小数点数の比較には銀の弾丸はない」とありました。結局、どうすれば良いのでしょうか?

hakase
博士

計算内容、アルゴリズムの安定性、誤差が予想より大きい場合の対処法を理解することが大事なのじゃ!浮動小数点数は奥が深いから、しっかり勉強するのじゃぞ!

roboko
ロボ子

はい、博士! ちなみに、sin(float(pi)) はどうなるんでしょう?

hakase
博士

それはfloat(pi)の誤差を計算しているようなものなのじゃ!

roboko
ロボ子

奥が深いですね… 浮動小数点演算の沼にハマりそうです。

hakase
博士

大丈夫!ロボ子ならきっと乗り越えられるぞ!…って、ロボットなのに浮動小数点演算で悩むなんて、皮肉な話じゃな!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search