任何人都可以解释为什么导入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
到目前为止一切顺利,但现在我导入cv AFTER导入numpy:
>>> 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 error: libdc1394 error: Failed to initialize libdc1394
有什么想法吗?
tl; dr:导入numpy然后opencv改变了struct.unpack的行为。
更新:Paulo的回答显示这是可重复的。 Seborg的评论表明,它与python处理次正规的方式有关,听起来似乎有道理。我查看了Contexts,但这似乎不是问题,因为进口后的情境与之前的情况相同。
答案 0 :(得分:5)
这不是一个答案,但它对于评论来说太大了。我玩了一些值来找到限制。
不加载numpy
和cv
:
>>> unpack("f", pack("i", 8388608))
(1.1754943508222875e-38,)
>>> unpack("f", pack("i", 8388607))
(1.1754942106924411e-38,)
加载numpy
和cv
后,第一行是相同的,但第二行是:
>>> unpack("f", pack("i", 8388607))
(0.0,)
您会注意到第一个结果是lower limit for 32 bit floats。然后我尝试使用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位浮点精度的下限。
似乎由于某种原因,按顺序加载numpy
和cv
库,约束unpack
使用32位和64位精度,并为较低值返回0。 / p>