tnk*_*epp 0 python precision idl-programming-language
我一直在将IDL代码翻译成Python,并注意到最终产品的差异.这些差异也不容忽视(例如,通过IDL我获得19.03而Python获得19.16).我确认这两个脚本产生相同的值(它们通常在第四,第五或第六个十进制中不同),直到我开始执行多个数组操作.我怀疑精度可能是原因(Python和IDL数组都是type=FLOAT).我做了一个简单的实验,我也看到了很大的差异.
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精度.底线是错误以不同的方式在两种语言中传播,从而产生不同的结果.我的问题是:
两种语言之间的精确度是否存在差异(即,在IDL中FLOAT与在Python中的意义相同,我认为它确实如此)?
有没有办法调和精度差异?
我对IDL没有多少经验; 我错过了一些明显的东西吗
当我写这篇文章时突然出现.我看到与OP相同的问题(Python是正确的).
>>> 3015/0.0002529821940697729
>>> 11917835.
Run Code Online (Sandbox Code Playgroud)
>>> 3015/0.0002529821940697729
>>> 11917834.814763514
Run Code Online (Sandbox Code Playgroud)
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语句的参数打印更多的数字a和b,并将它们与上面显示的值.
| 归档时间: |
|
| 查看次数: |
388 次 |
| 最近记录: |