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をインポートしたらOK

今私は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 の出力にどのように影響するかを理解できません (パックは同じままです)。

「libdc1394」のことは、私が信じているように、レッドニシンです: ctypes エラー: libdc1394 エラー: libdc1394 の初期化に失敗しました

何か案は?

tl;dr: numpy をインポートしてから opencv をインポートすると、struct.unpack の動作が変わります。

更新: 以下の Paulo の回答は、これが再現可能であることを示しています。Seborg のコメントは、Python がサブノーマルを処理する方法と関係があることを示唆していますが、これはもっともらしく聞こえます。コンテキストを調べましたが、それは問題ではないようでした。インポート後のコンテキストはインポート前と同じだったからです。

4

1 に答える 1

5

これは答えではありませんが、コメントするには大きすぎます。限界を見つけるために値を少しいじってみました。

ロードせずnumpycv:

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

numpyとを読み込んだ後cv、最初の行は同じですが、2 行目は次のようになります。

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

最初の結果が32 ビット float の下限であることがわかります。次に、 で同じことを試しました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ライブラリをこの順序でロードすると、 unpack32 ビットと 64 ビットの精度を使用し、それよりも低い値に対して 0 を返すように制限されているようです。

于 2013-08-28T17:31:32.157 に答える