奇怪的numpy.float96行为

时间:2009-10-14 11:36:56

标签: python numpy

我缺少什么:

In [66]: import numpy as np

In [67]: np.float(7.0 / 8)
Out[67]: 0.875 #OK

In [68]: np.float32(7.0 / 8)
Out[68]: 0.875 #OK

In [69]: np.float96(7.0 / 8)
Out[69]: -2.6815615859885194e+154 #WTF

In [70]: sys.version
Out[70]: '2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)]'

编辑。 在cygwin上面,上面的代码工作正常:

$ python
Python 2.5.2 (r252:60911, Dec  2 2008, 09:26:14)
[GCC 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.float(7.0 / 8)
0.875
>>> np.float96(7.0 / 8)
0.875

为了完整性,我在普通的python(而不是Ipython)中检查了这段代码:

C:\temp>python
Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.float(7.0 / 8)
0.875
>>> np.float96(7.0 / 8)
-2.6815615859885194e+154
>>>

修改

我在Numpy的trac网站(976902884)上看到了三个错误报告,但这个报告似乎与字符串表示无关。因此我打开了一个新的bug(1263)。将在此处更新进度

3 个答案:

答案 0 :(得分:2)

这对我来说很好用:

In [1]: import numpy as np

In [2]: np.float(7.0/8)
Out[2]: 0.875

In [3]: np.float96(7.0/8)
Out[3]: 0.875
你正在使用什么Numpy?我使用的是Python 2.6.2和Numpy 1.3.0,我使用的是64位Vista。

我在使用Python 2.5.2和Numpy 1.2.1运行32位XP的另一台计算机上尝试了同样的事情,令我惊讶的是我得到了:

In [2]: np.float96(7.0/8)
Out[2]: -2.6815615859885194e+154

经过一番调查,在32位XP上安装Python 2.6.3和Numpy 1.3.0后,我发现:

In [2]: np.float96(7.0/8)
Out[2]: 0.875

所以它必须是Numpy的旧版本中的错误或旧版本的Python中的错误...

答案 1 :(得分:2)

问题是由mingw编译器(用于官方numpy二进制文件的编译器)和MS运行时(一个printf来自)之间不兼容引起的。

MS编译器认为long double和double是等效类型,MS C运行时(包括printf)也是如此。由于某种原因,Mingw将long double定义为足以容纳80位扩展精度数字,但当然MS printf不知道它,并且无法正确打印long double。

我们通过使用我们自己的格式化函数绕过了一些问题,但我认为真正的解决方法是强制long double在使用mingw构建时成为double的同义词。我认为这将适用于numpy 1.5.0。

答案 2 :(得分:1)