Python 为什么在相同的环境中结果会不同?

Python 为什么在相同的环境中结果会不同?,python,python-3.x,Python,Python 3.x,我有以下功能: 将numpy导入为np my_rects=np.array([[5187926461080]] relative_rects=np.array([[16,53,116,286.]] 作物宽度=我的矩形[:,2]-我的矩形[:,0] 作物高度=我的直肠[:,3]-我的直肠[:,1] def expand_rects(rects,img_width,img_height,width_ratio,height_ratio,epsilon=1e-5): W=rects[:,2]-rect

我有以下功能:

将numpy导入为np
my_rects=np.array([[5187926461080]]
relative_rects=np.array([[16,53,116,286.]]
作物宽度=我的矩形[:,2]-我的矩形[:,0]
作物高度=我的直肠[:,3]-我的直肠[:,1]
def expand_rects(rects,img_width,img_height,width_ratio,height_ratio,epsilon=1e-5):
W=rects[:,2]-rects[:,0]
H=rects[:,3]-rects[:,1]
中心x=(矩形[:,0]+矩形[:,2])/2
中心y=(矩形[:,1]+矩形[:,3])/2
res=np.zeros_like(rects,dtype='float32')
res[:,0]=中心x-W*宽度比/2
res[:,2]=中心x+W*宽度比/2
res[:,1]=中心y-H*高度比/2
res[:,3]=中心y+H*高度比/2
res[:,0]=np.clip(res[:,0],0,img_宽度)
res[:,2]=np.clip(res[:,2],0,img_宽度)
res[:,1]=np.clip(res[:,1],0,img_高度)
res[:,3]=np.clip(res[:,3],0,img_高度)
返回res
打印(展开矩形(相对矩形、作物宽度、作物高度、1.2、1.1))
运行此操作后,我得到以下结果:

5.999996  41.34999  126.       288.
但是,第一个元素应该是6.0,而不是5.99996(66−1.2×(116−16)÷2 = 6). 此外,如果我将函数放入另一个大文件中,使用相同的输入,输出将变成:

6. 41.35 126. 288.
我的环境是:

Linux(无)4.9.37#1 SMP周二11月13日10:04:52 CST 2018 armv7l GNU/Linux
root@(无):/jkklk/projects/#python3
Python 3.7.3(默认值,2019年4月3日,05:39:12)
linux上的[GCC 8.3.0]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。

这有外植体吗?我真的需要结果稳定(每次应该是5.999996)。

表示浮点值对于某些计算机语言(包括Python)来说是一个非常老的问题。您可以在这里的官方文档中阅读更多内容:

其中的这一特定部分可能会给您一个提示:

由于值的显示方式,许多用户不知道近似值。Python只打印机器存储的二进制近似值的真正十进制近似值。在大多数机器上,如果Python要打印为0.1存储的二进制近似值的真正十进制值,它必须显示:


最后,如果要获得一致的输出,则必须将其强制转换为整数或使用。

在什么上运行此操作?你看到浮点精度有问题,但是对于这么简单和小的计算来说,错误是惊人的大,所以我想知道你是在旧的还是小的硬件上运行它?当你说“运行这个”时,你是指从CLI还是保存为.py并像那样运行?是的,我在Hisilicon SoC上以保存的.py文件运行它。有没有可能产生更准确结果的版本对结果数组使用
float64
而不是
float32
,我希望结果是5.999996,而不是6。所以也许我应该将dtype设置为
float16
>>> 0.1
>>>
0.1000000000000000055511151231257827021181583404541015625