IDL与Python Float

tnk*_*epp 0 python precision idl-programming-language

我一直在将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
Run Code Online (Sandbox Code Playgroud)

蟒蛇

a = 0.01
b = 0.00

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

print(b)
    >>> 9.999999999999831
print(c)
    >>> 10.0
Run Code Online (Sandbox Code Playgroud)

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

  1. 两种语言之间的精确度是否存在差异(即,在IDL中FLOAT与在Python中的意义相同,我认为它确实如此)?

  2. 有没有办法调和精度差异?

  3. 我对IDL没有多少经验; 我错过了一些明显的东西吗

PS:

当我写这篇文章时突然出现.我看到与OP相同的问题(Python是正确的).

IDL

>>> 3015/0.0002529821940697729
>>> 11917835.
Run Code Online (Sandbox Code Playgroud)

蟒蛇

>>> 3015/0.0002529821940697729
>>> 11917834.814763514
Run Code Online (Sandbox Code Playgroud)

War*_*ser 6

FLOAT在IDL中是单精度(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
Run Code Online (Sandbox Code Playgroud)

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