我缺少什么:
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,902和884)上看到了三个错误报告,但这个报告似乎与字符串表示无关。因此我打开了一个新的bug(1263)。将在此处更新进度
答案 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)
对于1.3.0版本的Windows上的长双重格式问题,有一些修复;至少 http://projects.scipy.org/numpy/changeset/6219 http://projects.scipy.org/numpy/changeset/6218 http://projects.scipy.org/numpy/changeset/6217