この記事は UdonTech Advent Calendar 2023の3日目の記事です。 なんか良い具合にネタが転がりこんできたので、もう一本穴埋め記事を投稿しときます :p
最近アドベントカレンダーを書いていたせいか、200イイネ突破みたいな感じでこちらの記事がfacebookのフィードに流れてきました。
この記事から派生して、浮動小数点数の比較ってどうやりゃ良いの?
というような記事も書かれていました。
元記事の是非はともかくとして浮動小数点数同士の比較については、こちらに良くまとまった記事があります。
Comparing Floating Point Numbers, 2012 Editionrandomascii.wordpress.com
10年ほど前の記事ですが、私が最初に見たのはもうちょっと前だったような気がします。
この記事では3つの比較方法について紹介されていて、ざっくりまとめると
- 二つの数の差の絶対値がマシンイプシロン(以降εとする)以下かどうか
- 二つの数の差の絶対値を、絶対値が大きい方の数の絶対値で割ったもの(相対誤差)がε以下かどうか
- ULP (一番下の1が立っているbit)でのとなりあう浮動小数点数の差 と比較して1ULP以下ならOK
注意する点として、0とある浮動小数点数との比較を行なう場合は、2、3の手法はほぼ無意味で1を使うべし といったあたりが挙げられてます。
じゃ実際のところ、数値計算ではどの判定方法を使っているかというと、たぶんどれも使ってません。
ここで挙げられている比較方法はテストなんかで、ある値が以前の値と等しいか?みたいな比較を行なう時には便利なんですが 数値計算の場合、「違う値が返ってきてるけど物理的には許容範囲」ということが多々あります。
というわけで、たいていの場合は1の絶対誤差を、物理的に意味のある許容誤差と比較するというのがよく用いられてるんじゃないかと。