我遇到了一些有趣/奇怪的东西,或者我无法理解/理解的东西。
在这里,
代码 - 1:Python3.5
a = 0.0;
print(type(a));
for i in range(10000):
a += i;
print(a);
print(type(a));
输出:
<class 'float'>
49995000.0
<class 'float'>
代码 - 2:Cython0.26
%%cython
cdef float a = 0;
print(type(a));
for i in range(10000):
a += i;
print(a);
print(type(a));
输出:
<class 'float'>
49992896.0
<class 'float'>
我正在运行debian stretch(64位):我在加载%load_ext cython
后在我的jupyter笔记本中运行了这些代码。
我假设,python的默认值是float64
,因为我运行的是64位操作系统而没有明确设置为使用float32
。假设cython从python继承float数据类型。
为什么输出不同?并且差异似乎很大,迭代次数很多 - 这让我认为是截断/舍入尾随位。有人可以解释背后的原因以及如何避免?
修改 这个问题的目的是了解数据类型之间的差异,因此适用于更广泛的受众。
答案 0 :(得分:2)
在C中,float通常是IEEE single precision,也就是float32。而float64是IEEE双精度。尝试:
cdef double a = 0;