2009-10-14 69 views
4

我缺少什么:奇怪numpy.float96行为

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站点的报告(976,902884),但这个似乎与字符串表示没有关系。所以我开了一个新的bug(1263)。将更新这里的进步

+0

我不能在linux(ubuntu 64位)上重现这个,因为它没有'float96',只有'float128',所以这个问题可能是Windows特定的。 – 2009-10-14 12:41:11

+0

无法在Mac雪豹上重现,原因相同。 – 2009-10-14 12:56:37

+0

我希望看到bug报告的结果:) – Nope 2009-10-15 17:08:54

回答

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上。

我试图运行32位XP与Python 2.5.2和1.2.1 numpy的另一台计算机上同样的事情让我吃惊,我得到:

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

经过一番调查后,安装Python 2.6。 3和32位XP numpy的1.3.0,我发现:

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

所以必须处于或旧版本numpy的在旧版本的Python中的错误的错误...

2

问题是由MinGW的编译器(用于正式numpy的二进制的)和MS运行时(该一个printf的是来自)之间的不兼容而引起的。

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

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