IDL 与 Python 浮动

IDL vs. Python Float

我一直在将 IDL 代码翻译成 Python 并注意到最终产品的差异。差异也不容忽视(例如,通过 IDL,我得到 19.03,而 Python 得到 19.16)。我确认这两个脚本产生相同的值(它们通常在小数点后第四位、第五位或第六位不同),直到我开始执行多个数组操作为止。我怀疑精度可能是原因(Python 和 IDL 数组都是 type=FLOAT)。我做了一个简单的实验,我也看到了这里的显着差异。

IDL

a = 0.01
b = 0.0

for r = 1,1000 do begin
   b += a
endfor
c = a * 1000

print,b
    >>> 10.0001
print,c
    >>> 10.0000

Python

a = 0.01
b = 0.00

for r in range(1000):
    b += a
c = a * 1000

print(b)
    >>> 9.999999999999831
print(c)
    >>> 10.0

当然,这个例子中的差异仍然很小,但 Python 显然比 IDL 更接近真实。我希望结果相同,因为两种语言都使用 FLOAT 精度。底线是错误以不同的方式在两种语言中传播,这会产生不同的结果。我的问题是:

  1. 两种语言的精度是否存在差异(即 FLOAT 在 IDL 中的含义是否与在 Python 中的含义相同,我认为是)?

  2. 有什么方法可以调和精度差异吗?

  3. 我对 IDL 没有多少经验;我是不是遗漏了什么明显的东西?

PS:

在我写作时 this post 弹出。我看到与该 OP 相同的问题(Python 是正确的)。

IDL

>>> 3015/0.0002529821940697729
>>> 11917835.

Python

>>> 3015/0.0002529821940697729
>>> 11917834.814763514
IDL中的

FLOAT是单精度(32位),DOUBLE是双精度(64位)。

在python(和numpy)中,默认的浮点类型是双精度(64位)。

您可以使用 numpy 重新创建单精度 IDL 计算,如下所示:

In [9]: import numpy as np

In [10]: a = np.array(0.01, dtype=np.float32)

In [11]: b = np.array(0.0, dtype=np.float32)

In [12]: for r in range(1000):
    ...:     b += a
    ...:     

In [13]: c = a*1000

In [14]: print(b)
10.000133514404297

In [15]: print(c)
9.99999977648

您可以使用 IDL 打印语句的 FORMAT 参数打印更多 ab 的数字,并将它们与上面显示的值进行比较。