`
jack
  • 浏览: 393115 次
  • 来自: 温州
社区版块
存档分类
最新评论

罕见ceil bug

    博客分类:
  • Ruby
阅读更多
   真是一个少见的问题,没有找到发生的原因,也没有办法再测试代码中重现,但是项目中就出现,但不是每次都有.看上去很像内存溢出而产生的.

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

29.0.ceil = 30

没错 29.0 ceil运算的结果是30 

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

  






分享到:
评论
9 楼 Magicloud 2009-08-07  
hhhtj 写道
都#to_i了还#ceil什么啊,在#to_i的过程中已经#ceil完成了。

(29.0).to_i过程中ceil了?
8 楼 hhhtj 2009-07-22  
都#to_i了还#ceil什么啊,在#to_i的过程中已经#ceil完成了。
7 楼 jhsea3do 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]
6 楼 ray_linn 2009-07-19  
试了下在ironruby里
29.0.ceil=29
5 楼 jack 2009-07-19  
很有可能。

这些数值是平面上取两点之间直线,等分直线获取的坐标。头尾一定是整形的,但是因为计算需要,转换成浮点了。而这个bug就是出现在头尾上。
4 楼 night_stalker 2009-07-18  
jack 写道
代码中 1.0-300.0的数据都有,不过仅仅几个点上出bug。


可能运算的过程中某几个数多了那么 0.00000000000001 ,毕竟浮点数在计算机的表示是二进制,变成十进制数不是整的情况太常见了 ……
3 楼 jack 2009-07-18  
代码中 1.0-300.0的数据都有,不过仅仅几个点上出bug。
2 楼 night_stalker 2009-07-18  
重现:

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


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

还有个可能是某个地方重定义了 ceil,在 .rb 和 .c 里面搜搜 def ceil 和 "ceil" 或许会有惊喜 ……
1 楼 livte 2009-07-18  
自己目前的環境是
ruby 1.8.6 (2008-08-11 patchlevel 287) [x86_64-linux]
Ruby Enterprise Edition 20090610
& Ubuntu9.04
沒有遇到這個問題過:)

相关推荐

    Ceil.java 算法

    Ceil.java

    【delphi_文章】delphi的取整函数round、trunc、ceil和floor.doc

    Delphi programming language 提供了四种取整函数:Round、Trunc、Ceil 和 Floor,每种函数都有其特点和应用场景。 Round 函数 Round 函数是 Delphi 中最常用的取整函数,它对一个实数进行四舍五入处理。 Round ...

    oracle中函数 trunc(),round(),ceil(),floor的使用详解

    1.round函数(四舍五入) 描述 : 传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果 参数: number : 欲处理之数值 ...ceil和floor函数在一些业务数据的时候,有时还是很有用的。 ce

    PHP程序设计-3期(KC016) 2.9.3 ceil函数习题.doc

    `ceil(6.15)`、`ceil(6)`和`ceil(5.49)`都会返回整数部分,即6;而`ceil(5.99)`会将5.99向上舍入到6,所以它们不相同。 3. `echo ceil(666.999);`的结果是?(**B. 667**) `ceil()`函数会将666.999向上舍入到最...

    详解Python3中ceil()函数用法

    ### Python3中`ceil()`函数详解 #### 函数概述 `ceil()`函数是Python标准库中的`math`模块提供的一种数学函数,它主要用于对输入的数值进行向上取整操作,即返回不小于输入数值的最小整数。此功能在处理需要进行...

    PHP程序设计-3期(KC016) 2.9.3 ceil函数 拓展知识.doc

    首先,让我们深入理解`ceil()`函数的工作原理。当给`ceil()`函数传递一个浮点数时,它会检查这个数的小数部分。如果小数部分非零,无论它是正还是负,`ceil()`都会将整个数向上舍入到最接近的整数。也就是说,它会将...

    JavaScript Math.ceil() 函数使用介绍

    Math.ceil(x) — 返回大于等于... ceil函数参数 x — 为number类型的数字 ceil函数返回值 返回大于等于x的最小整数 ceil函数示例 [removed](Math.ceil(5.99)); [removed](Math.ceil(-5.99)); [removed](Math.ceil(1.01)

    Python中的ceil()方法使用教程

    ### Python中的`ceil()`方法详解 在Python编程语言中,`ceil()`方法是数学操作中的一个常用函数,属于`math`模块的一部分。该方法的主要功能是返回不小于给定数值的最小整数,即对输入的数值进行向上取整。 #### ...

    PHP程序设计-3期(KC016) 2.9.3 ceil函数 常见问题.docx

    以下将详细解释关于`ceil()`函数的一些常见问题和解决方法。 问题1:参数不能写字符串 `ceil()`函数期待一个数字类型的参数,包括整数或浮点数。如果尝试传递一个字符串,PHP会抛出一个错误,因为无法确定如何对非...

    Pytorch maxpool的ceil_mode用法

    pytorch里面的maxpool,有一个属性叫ceil_mode,这个属性在api里面的解释是 ceil_mode: when True, will use ceil instead of floor to compute the output shape 也就是说,在计算输出的shape的时候,如果ceil_...

    C/C++取整函数ceil(),floor()

     如: ceil(10.5) == 11 ceil(-10.5) ==-10  floor()是向负无穷大舍入,floor(-10.5) == -11;  ceil()是向正无穷大舍入,ceil(-10.5) == -10  fix  朝零方向取整,如fix(-1.3)=-1; fix(1.3)=1;  floor ...

    VC6用浮点数取四舍五入取整好像有Bug,大家看一下

    在C++标准库中,可以使用`std::round`、`std::ceil`、`std::floor`等函数进行浮点数的取整操作。但需要注意的是,VC6并不完全支持C++标准库,尤其是C++98标准之后的功能。因此,在VC6中,开发者可能需要使用其他方法...

    MATLAB中取整函数(fix--floor--ceil--round)的使用.doc

    MATLAB 作为一款强大的数学建模工具,提供了多种取整函数,包括 fix、floor、ceil 和 round。这些函数可以帮助用户快速实现数字的取整操作,从而满足不同应用场景中的需求。 1. fix(x) 函数:截尾取整 fix 函数...

    JavaScript Math.ceil 方法(对数值向上取整)

    在这些方法中,Math.ceil()是一个非常有用的工具,它可以将一个数字向上舍入到最近的整数。换句话说,无论传入的参数是正数还是负数,Math.ceil()方法都会返回一个大于或等于该参数的最小整数。 Math.ceil()方法的...

    js中Math之random,round,ceil,floor的用法总结.docx

    ### JavaScript Math 对象中的 Random, Round, Ceil, Floor 方法详解 #### 一、引言 在JavaScript编程中,Math对象提供了一系列用于执行常见的数学运算的属性和方法。本文将重点介绍Math对象中的四个常用方法:`...

    js中Math之random,round,ceil,floor的用法总结

    JavaScript中的Math对象包含了一系列用于数学计算的函数,其中包括random、round、ceil和floor四个方法,它们在编程中常用于处理数值运算,特别是涉及到随机数和数值取整的情况。以下是这四个方法的详细说明: 1. *...

Global site tag (gtag.js) - Google Analytics