5

重複の可能性:
Pythonでの浮動小数点の等式

Pythonコードについて小さな「問題」があります(現在、バージョン2.5をikaゲームエンジンで使用しています)。私は現在、ゲームのオブジェクトのスクリプトを作成しています。2つの浮動小数点数を比較しても安全かどうかを知りたいのですが、次のようになります。

私が現在行っていることの簡単な例を示します。

すべてのオブジェクトには、浮動小数点で表される0〜9の速度があります。例えば

speed = 4.83
cord_x = 10.0
cord_y = 10.0

AddMovementメソッドがあります。これはX、Y値を設定し、オブジェクトの目標座標を表します。

target_x = 25.0
target_x = 26.75
movement = True # This represents if the object is moveing or not

すべてのフレームで、最大速度は次の値に等しくなります。

maximum_x_speed = abs(cord_x-target_x)
maximum_y_speed = abs(cord_y-target_y)

そして、実際の速度は次のようになります。

# Get the real X speed in this frame
if maximum_x_speed < speed:
    real_x_speed = maximum_x_speed
else:
    real_x_speed = speed

# Get the real Y speed in this frame
if maximum_y_speed < speed:
    real_y_speed = maximum_y_speed
else:
    real_y_speed = speed

ここで、このreal_x_speed値とreal_y_speed値に基づいて、座標からこの値を減算します。

if target_x < cord_x:
    cord_x -= real_x_speed
elif target_x > cord_x:
    cord_x += real_x_speed
if target_y < cord_y:
    cord_y -= real_y_speed
elif target_y > cord_y:
    cord_y += real_y_speed

そして最後に、私は平等をチェックします

if cord_x == target_x and cord_y == target_y:
    # Halt movement, reached goal
    movement = False

過去に0.1の問題で浮動小数点エラーが発生しましたが、これが何らかのエラーを引き起こすのではないかと心配しています。またはこれは論理的に不可能ですか?

文法ミスがあったらごめんなさい。英語は私の母国語ではありません...このロジックを変更する必要があるかどうかにかかわらず、いくつかのヒントをいただければ幸いです。

4

3 に答える 3

6

いいえ、このタイプのコードは決して良い考えではありません。

浮動小数点エラーが蓄積され、追跡が非常に困難になります。実際には「イプシロン」アプローチを使用する必要があります。つまり、差が設定された定数よりも小さい場合は、2つの値が等しいと見なします。これは、イプシロンと呼ばれることがよくあります。

def floats_equal(x, y, epsilon = 1e-4):
  return abs(x - y) < epsilon

もちろんepsilon、アプリケーションの必要に応じて値を微調整する必要がありますが、値がピクセルベースの場所を表すゲームでは、それほど正確にする必要はありません。

他の回答でも指摘されているように、マシン上で動作する最小のイプシロンがありますが、多くの場合、上記のようなアプリケーションレベルのイプシロンを使用する方がよいことに注意してください。プレゼンテーションの目的で2Dピクセル空間で物事を補間する場合、2.22044604925 * 10 -16sys.float_info.epsilonのオーダーの精度のポイントはほとんどありません。これは、私のローカルシステムの値です。

于 2012-10-11T12:08:52.833 に答える
4

通常は、次のようにすることをお勧めします。

EPSILON = 0.00001 # or whatever 

if abs(cord_x - target_x) < EPSILON and abs(cord_y - target_y) < EPSILON:
    # Halt movement, reached goal
    movement = False

一部の人々は次のようEPSILONになります。

import sys

sys.float_info.epsilon

1 と、float として表現できる 1 より大きい最小値との差はどれですか -こちら

于 2012-10-11T12:10:40.070 に答える
0

短い答えは、あなたがしていることは悪いことです。長い答えは、正しい方法はあなたが何をしているかに少し依存するということです. float を比較するいくつかの異なる方法を見てみましょう。

http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

浮動小数点数を扱う場合は、全体を読む価値があります。

于 2012-10-11T12:24:28.400 に答える