Python浮点

Python浮点,python,Python,可能重复: 我对Python代码有一个小问题(我现在在ika游戏引擎中使用2.5版)。我目前正在为我的游戏编写对象脚本,我想知道这样比较两个浮点数是否安全: 我将举一个简短的例子说明我目前的工作 每个对象都有一个速度,从0到9,用浮点表示。比如说 speed = 4.83 cord_x = 10.0 cord_y = 10.0 他们有一个移动方法。这将设置X、Y值,并表示对象的目标坐标 target_x = 25.0 target_x = 26.75 movement = True # Th

可能重复:

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

我将举一个简短的例子说明我目前的工作

每个对象都有一个速度,从0到9,用浮点表示。比如说

speed = 4.83
cord_x = 10.0
cord_y = 10.0
他们有一个移动方法。这将设置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
我在过去有过浮点错误,比如0.1版本的错误等等。。。我担心这会导致某种错误。或者这在逻辑上是不可能的

如果我有语法错误,对不起。英语不是我的母语。。。
如果我要改变这个逻辑,或者不改变,我会非常感激一些提示。

不,这种类型的代码从来都不是一个好主意

浮点错误会不断累积,使跟踪变得非常困难。你真的应该使用一个“ε”的方法,即如果两个值相等,如果差异小于某个集合常量,常被称为:

def浮动等于(x,y,ε=1e-4):
返回abs(x-y)
当然,您必须根据应用程序的需要调整epsilon的值,但是如果游戏中的值表示基于像素的位置,则不需要太高的精度


请注意,正如在其他答案中所指出的,有一个最小的epsilon可以在机器上工作,但通常最好使用应用程序级epsilon,如上面的一个。当在2D像素空间内插值以进行表示时,几乎没有精度为2.22044604925*10-16的点,这恰好是我的本地系统上的
sys.float\u info.epsilon
的值。

这样做通常更好:

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

这是1和大于1的最小值之间的差值,可以表示为浮点-

简单的回答是你所做的是不好的。长话短说,正确的方法取决于你在做什么。看看比较浮动的几种不同方法:


如果你使用浮点数,整个过程都值得一读。

什么是“0.1”问题?你是浮点错误、异常,还是说两个想法不相等?这两个东西是不相等的。我之前有一个案例,我把0.1加了10次,然后检查它是否等于1.0。谢谢!实际上,epsilon=0.01在我的例子中也适用(我现在测试了这个)。对象将使用整数值进行渲染,因此基本上看不到差异。
if cord_x == target_x and cord_y == target_y:
    # Halt movement, reached goal
    movement = False
def floats_equal(x, y, epsilon = 1e-4):
  return abs(x - y) < epsilon
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
import sys

sys.float_info.epsilon