4

通常、私は2つのフロートを、それらが非常に少ない数の範囲内にあるかどうかを確認することによって比較します。テーブルキーについては、キーがわからないと存在するかどうかわからないため、機能しません(それが理にかなっている場合)。

64ビットコンピューターでのlua5.1の例:

a, b, c = 1.7, -0.8, -0.4
d = a + b + c -- prevents constant folding
print(string.format('%1.20f', d)) --  0.49999999999999989000  (around 0.5)
assert(d ~= 0.5)
t = {[0] = 'foo', [0.5] = 'bar'}
print(t[d]) -- nil  (I want it to print 'bar')

基本的に、浮動小数点エラーを考慮しながら、テーブル内のキーを見つけるにはどうすればよいですか?テーブル内の各キーと比較せずに動作させたいので、大きなテーブルでも高速にできます。これを行うための組み込み関数はおそらくすでに存在しますが、見つかりませんでした。

どんな助けでもいただければ幸いです!

4

1 に答える 1

4

さまざまなソースからの浮動小数点数からインデックスを作成する必要がある場合は、保持したい小数点以下の桁数の固定形式の文字列に変換し、それらの文字列でテーブルにインデックスを作成することをお勧めします。

__newindexプロキシテーブルに適切なメタメソッドを設定することで、これを自動的に行うこともできます。

于 2012-10-11T01:41:31.127 に答える