Ruby中浮点数范围的默认步长是什么?

4
在Ruby中,this代码可以编译: (Math::PI * 6 .. Math::PI * 6.5).bsearch{|f| Math.cos(f) <= 0.5} 在这种情况下,默认的范围步长是多少?
1个回答

6

你的情况中没有步骤。浮点数范围不能被迭代。

代码如下:

(Math::PI * 6 .. Math::PI * 6.5).to_a

throws 一个 TypeError:

TypeError: 无法从 Float 迭代


你的代码是有效的,因为 bsearch 并不是通过范围值进行迭代。相反,它“知道”最小值和最大值,并将间隔减半,直到找到一个块 {|f| Math.cos(f) <= 0.5 } 返回 true 的值。

为了查看这一点,您可以添加一个 puts 语句来检查 bsearch 尝试的值:

(Math::PI * 6 .. Math::PI * 6.5).bsearch { |f| puts f; Math.cos(f) <= 0.5 }

1
具有Float限制的范围对象是有效的。但像to_a一样迭代它是无效的。bsearch通过将区间减半而不是迭代范围来遍历范围。 - Cristian Lupascu
请查看我的回答更新,以便检查 bsearch 尝试的值。二分搜索是一种高效的搜索算法,每次搜索都将搜索范围减半。这里有更深入的解释:http://en.wikipedia.org/wiki/Binary_search_algorithm。 - Cristian Lupascu
1
@LeoCorrea 很好的观点。你可以通过 the #step method 来逐步执行它,因为该方法有一个参数表示步长,如果未指定,则默认为 1 - Cristian Lupascu
使用 Ruby 2.2.0 和以下代码:class Float; def succ; next_float; end; end,您可以通过 each 迭代浮点数范围。 - Adrian
你说它将区间减半,直到出现 Math.cos(f) <= 0.5 为真的值。这是不正确的。你在结尾显示的测试对我而言打印了数十个步骤,即使在第二步中已经满足 Math.cos(f) <= 0.5(我修改了它以便打印该布尔值)。 - Stefan Pochmann
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接