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 精度。底线是错误以不同的方式在两种语言中传播,这会产生不同的结果。我的问题是:
两种语言的精度是否存在差异(即 FLOAT 在 IDL 中的含义是否与在 Python 中的含义相同,我认为是)?
有什么方法可以调和精度差异吗?
我对 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
参数打印更多 a
和 b
的数字,并将它们与上面显示的值进行比较。
我一直在将 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 精度。底线是错误以不同的方式在两种语言中传播,这会产生不同的结果。我的问题是:
两种语言的精度是否存在差异(即 FLOAT 在 IDL 中的含义是否与在 Python 中的含义相同,我认为是)?
有什么方法可以调和精度差异吗?
我对 IDL 没有多少经验;我是不是遗漏了什么明显的东西?
PS:
在我写作时 this post 弹出。我看到与该 OP 相同的问题(Python 是正确的)。
IDL
>>> 3015/0.0002529821940697729
>>> 11917835.
Python
>>> 3015/0.0002529821940697729
>>> 11917834.814763514
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
参数打印更多 a
和 b
的数字,并将它们与上面显示的值进行比较。