浏览 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是找到的其中一个特例,也不知道是否有其他的也会这样. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-07-18
自己目前的環境是
ruby 1.8.6 (2008-08-11 patchlevel 287) [x86_64-linux] Ruby Enterprise Edition 20090610 & Ubuntu9.04 沒有遇到這個問題過:) |
|
返回顶楼 | |
发表时间:2009-07-18
最后修改:2009-07-18
重现:
01> n=29.00000000000001 #=> 29.0 02> n.ceil #=> 30 这个小小的差异经常出现在浮点数运算中。 还有个可能是某个地方重定义了 ceil,在 .rb 和 .c 里面搜搜 def ceil 和 "ceil" 或许会有惊喜 …… |
|
返回顶楼 | |
发表时间:2009-07-18
代码中 1.0-300.0的数据都有,不过仅仅几个点上出bug。
|
|
返回顶楼 | |
发表时间:2009-07-18
jack 写道 代码中 1.0-300.0的数据都有,不过仅仅几个点上出bug。
可能运算的过程中某几个数多了那么 0.00000000000001 ,毕竟浮点数在计算机的表示是二进制,变成十进制数不是整的情况太常见了 …… |
|
返回顶楼 | |
发表时间:2009-07-19
最后修改:2009-07-19
很有可能。
这些数值是平面上取两点之间直线,等分直线获取的坐标。头尾一定是整形的,但是因为计算需要,转换成浮点了。而这个bug就是出现在头尾上。 |
|
返回顶楼 | |
发表时间:2009-07-19
最后修改:2009-07-19
试了下在ironruby里
29.0.ceil=29 |
|
返回顶楼 | |
发表时间: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] |
|
返回顶楼 | |
发表时间:2009-07-22
都#to_i了还#ceil什么啊,在#to_i的过程中已经#ceil完成了。
|
|
返回顶楼 | |
发表时间:2009-08-07
hhhtj 写道 都#to_i了还#ceil什么啊,在#to_i的过程中已经#ceil完成了。
(29.0).to_i过程中ceil了? |
|
返回顶楼 | |