我什么时候可以将NetLogo值作为整数进行比较?

时间:2014-01-05 03:16:51

标签: netlogo

是否有官方文档来解决NetLogo 5.0.5编程指南中这两个语句之间的明显冲突:

  • “补丁的坐标始终为整数”(来自Agents section

  • “NetLogo中的所有数字都在内部存储为双精度浮点数”(来自同一页面上的Math部分。)

这就是我要问的原因:如果整数补丁坐标存储为非常接近整数值的浮点数,那么我应该避免比较相等。例如,如果确实没有整数,而不是

if pxcor = pycor...

我应该使用通常的公差检查,例如

if abs( pxcor – pycor) < 0.1 ...

是否有一些官方消息说更复杂的代码是不必要的?

数学部分似乎也暗示缺少整数文字:“3和3.0之间没有区别”。那么避免与常量进行比较的官方政策是什么?例如,是否有正式的制裁来编写像

这样的代码
if pxcor = 3...

是否在某处定义了滑块以产生浮点值?如果是这样,比较滑块值是否相等似乎也无效。也就是说,如果是这样,就应该避免编写像

这样的代码
if pxcor = slider-value

即使滑块的最小值,最大值和增量值看起来像整数。

在这个问题中关注官方消息来源是因为我不仅仅是在尝试编写一个有效的程序。相反,我想告诉学生他们应该如何编程。我不想误导他们,所以感谢您的任何好建议。

2 个答案:

答案 0 :(得分:2)

NetLogo不是唯一以这种方式工作的语言,所有数字都在内部存储为双精度浮点数。最着名的其他语言是JavaScript。

NetLogo中的数学遵循IEEE 754,因此下面的内容实际上并不特定于NetLogo,但通常适用于IEEE 754。

用户手册中没有矛盾,因为在数学上,某些浮点数整数,完全。如果小数部分恰好为零,那么在数学上,它是一个整数,IEEE 754保证算术和比较操作的行为与您期望的一样。如果你加2和2,你将总是得到4,从不3.999 ......或4.00 ... 01。整数输入,整数输出。这适用于均衡分配的比较,加法,减法,乘法和除法。 (它可能不适用于其他操作,因此例如log 1000 10不完全是3,cos 90不完全是0。)

因此if pxcor = 3是完全有效的,正确的代码。 pxcor永远不会有小数部分,而3也没有,所以不会出现浮点不精确问题。

对于NetLogo滑块,如果滑块的min,max和increment都是整数,那么就没什么可担心的;滑块的值也总是一个整数。

(注意:我是NetLogo的首席开发人员,我编写了您引用的用户手册部分。)

答案 1 :(得分:1)

只是强调塞思所写的内容:

  

整数输入,整数输出。这适用于比较,添加,   均匀划分的减法,乘法和除法 (强调添加)

这是浮点不精确的经典实例:

observer> show (2 + 1) / 10
observer: 0.3
observer> show 2 / 10 + 1 / 10
observer: 0.30000000000000004

有关解释原因的精彩链接,请查看http://0.30000000000000004.com/