论坛首页 编程语言技术论坛

罕见ceil bug

浏览 5935 次
锁定老帖子 主题:罕见ceil bug
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-17   最后修改:2009-07-17
   真是一个少见的问题,没有找到发生的原因,也没有办法再测试代码中重现,但是项目中就出现,但不是每次都有.看上去很像内存溢出而产生的.

  在某些情况下 项目中A*寻路算法的一部分数值ceil的结果会出错,最典型的就是下面的

29.0.ceil = 30

没错 29.0 ceil运算的结果是30 

但是无论怎么在console中尝试,都无法重现这样的情况. 29.0是找到的其中一个特例,也不知道是否有其他的也会这样.

  






   发表时间:2009-07-18  
自己目前的環境是
ruby 1.8.6 (2008-08-11 patchlevel 287) [x86_64-linux]
Ruby Enterprise Edition 20090610
& Ubuntu9.04
沒有遇到這個問題過:)
0 请登录后投票
   发表时间:2009-07-18   最后修改:2009-07-18
重现:

01> n=29.00000000000001
#=> 29.0
02> n.ceil
#=> 30


这个小小的差异经常出现在浮点数运算中。

还有个可能是某个地方重定义了 ceil,在 .rb 和 .c 里面搜搜 def ceil 和 "ceil" 或许会有惊喜 ……
0 请登录后投票
   发表时间:2009-07-18  
代码中 1.0-300.0的数据都有,不过仅仅几个点上出bug。
0 请登录后投票
   发表时间:2009-07-18  
jack 写道
代码中 1.0-300.0的数据都有,不过仅仅几个点上出bug。


可能运算的过程中某几个数多了那么 0.00000000000001 ,毕竟浮点数在计算机的表示是二进制,变成十进制数不是整的情况太常见了 ……
0 请登录后投票
   发表时间:2009-07-19   最后修改:2009-07-19
很有可能。

这些数值是平面上取两点之间直线,等分直线获取的坐标。头尾一定是整形的,但是因为计算需要,转换成浮点了。而这个bug就是出现在头尾上。
0 请登录后投票
   发表时间:2009-07-19   最后修改:2009-07-19
试了下在ironruby里
29.0.ceil=29
2 请登录后投票
   发表时间:2009-07-21   最后修改:2009-07-21

irb(main):001:0> n=29.00000000000001
=> 29.0
irb(main):002:0> n.ceil
=> 30
irb(main):003:0> n.to_i.ceil
=> 29
irb(main):004:0> n.to_f.ceil
=> 30
irb(main):005:0> n=29.0
=> 29.0
irb(main):006:0> n.ceil
=> 29
irb(main):007:0> n.to_i.ceil
=> 29
irb(main):008:0> n.to_f.ceil
=> 29

$ irb -v
irb 0.9.5(05/04/13)
$ ruby -v
ruby 1.8.5 (2006-08-25) [i486-linux]
0 请登录后投票
   发表时间:2009-07-22  
都#to_i了还#ceil什么啊,在#to_i的过程中已经#ceil完成了。
0 请登录后投票
   发表时间:2009-08-07  
hhhtj 写道
都#to_i了还#ceil什么啊,在#to_i的过程中已经#ceil完成了。

(29.0).to_i过程中ceil了?
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics