NetLogo更新错误近似问题

时间:2014-11-15 18:33:30

标签: netlogo

请使用输出检查下面的NetLogo代码。

CODE:

to create-files
     let i 0.10
     while[i < 1]
     [
       set i i + .05
       show i
     ]
  end

输出:

observer: 0.15000000000000002
observer: 0.2
observer: 0.25
observer: 0.3
observer: 0.35
observer: 0.39999999999999997
observer: 0.44999999999999996
observer: 0.49999999999999994
observer: 0.5499999999999999
observer: 0.6
observer: 0.65
observer: 0.7000000000000001
observer: 0.7500000000000001
observer: 0.8000000000000002
observer: 0.8500000000000002
observer: 0.9000000000000002
observer: 0.9500000000000003
observer: 1.0000000000000002

我想知道更新错误的原因是什么?有一些约。发生了什么?如何避免呢?

2 个答案:

答案 0 :(得分:3)

看看the section on floating-point accuracy in the NetLogo programming guide。实际上,每种广泛使用的编程语言都存在同样的问题。基本上,为了能够代表真正的小数字和非常大的数字,你会遇到这样的问题。

一个简单的解决方法是使用precision将数字四舍五入到您想要的小数。在您的情况下,您可能想要:

to create-files
     let i 0.10
     while[i < 1]
     [
       set i precision (i + .05) 2
       show i
     ]
end

答案 1 :(得分:2)

布莱恩说。但请注意:

to create-files
  let i 2
  while [i < 20] [
    set i i + 1
    show i / 20
  ]
end

打印:

observer: 0.15
observer: 0.2
observer: 0.25
observer: 0.3
observer: 0.35
...