5

可能重复:
python中的浮点相等

我有一个关于我的 Python 代码的小“问题”(我现在在 ika 游戏引擎中使用 2.5 版)。我目前为我的游戏编写对象脚本,我想知道比较两个浮点数是否安全这种方式:

我将做一个简短的例子来说明我目前所做的事情。

每个对象都有一个速度,从 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

不,这种类型的代码绝不是一个好主意。

会有累积的浮点错误,使其很难跟踪。您确实应该使用“epsilon”方法,即如果差值小于某个设置常数(通常称为epsilon ),则认为这两个值相等:

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

当然,您必须epsilon根据应用程序的需要调整该值,但是值表示基于像素的位置的游戏不需要太高的精度。

请注意,正如其他答案中所指出的那样,有一个最小的epsilon 可以在机器上运行,但通常最好使用应用程序级 epsilon,例如上面的那个。出于演示目的在 2D 像素空间中插值时,很少有任何精度点在 2.22044604925 * 10 -16的数量级上,这恰好是sys.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 与可表示为浮点数的大于 1 的最小值之间的差 -这里

于 2012-10-11T12:10:40.070 回答
0

简短的回答是你所做的很糟糕。长答案是正确的方法取决于你在做什么。看一下比较浮点数的几种不同方法:

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

如果您使用浮点数,则值得通读整本书。

于 2012-10-11T12:24:28.400 回答