4

我错过了什么:

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 )上看到了三个错误报告,但这个似乎与字符串表示无关。因此,我打开了一个新错误(1263)。将在这里更新进度

4

3 回答 3

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的bug或者是旧版Python的bug……

于 2009-10-14T13:17:49.200 回答
2

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

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

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

于 2009-11-25T15:51:13.520 回答
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

于 2009-10-15T20:03:14.263 回答