15

谁能解释为什么导入 cv 和 numpy 会改变 python 的 struct.unpack 的行为?这是我观察到的:

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from struct import pack, unpack
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44

这是对的

>>> import cv
libdc1394 error: Failed to initialize libdc1394
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44

还是可以的,导入cv后

>>> import numpy
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44

导入 cv 然后 numpy 后确定

现在我重新启动python:

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from struct import pack, unpack
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44
>>> import numpy
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44

到目前为止一切顺利,但现在我在导入 numpy 之后导入 cv:

>>> import cv
libdc1394 error: Failed to initialize libdc1394
>>> unpack("f",pack("I",31))[0]
0.0

我已经重复了很多次,包括在多台服务器上,它总是以同样的方式进行。我也用 struct.unpack 和 struct.pack 试过,也没什么区别。

我无法理解导入 numpy 和 cv 如何对 struct.unpack 的输出产生任何影响(顺便说一句,pack 保持不变)。

我相信“libdc1394”的事情是一个红鲱鱼:ctypes错误:libdc1394错误:无法初始化libdc1394

有任何想法吗?

tl; dr:导入 numpy 然后 opencv 会改变 struct.unpack 的行为。

更新:保罗在下面的回答表明这是可重现的。Seborg 的评论表明这与 python 处理次常态的方式有关,这听起来很合理。我查看了上下文,但这似乎不是问题,因为导入后的上下文与它们之前的上下文相同。

4

1 回答 1

5

这不是答案,但对于评论来说太大了。我玩了一下这些值以找到极限。

没有加载numpycv

>>> unpack("f", pack("i", 8388608))
(1.1754943508222875e-38,)
>>> unpack("f", pack("i", 8388607))
(1.1754942106924411e-38,)

加载numpyand后cv,第一行是一样的,但是第二行:

>>> unpack("f", pack("i", 8388607))
(0.0,)

您会注意到第一个结果是32 位浮点数的下限。然后我尝试了同样的方法d

不加载库:

>>> unpack("d", pack("xi", 1048576))
(2.2250738585072014e-308,)
>>> unpack("d", pack("xi", 1048575))
(2.2250717365114104e-308,)

加载库后:

>>> unpack("d",pack("xi", 1048575))
(0.0,)

现在第一个结果是 64 位浮点精度的下限。

似乎由于某种原因,按该顺序加载numpycv库会限制unpack使用 32 位和 64 位精度并返回 0 以获得较低的值。

于 2013-08-28T17:31:32.157 回答