2
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_26).

scala> 1.0 / Double.MinPositiveValue
res0: Double = Infinity

哦。恼人的。我希望我可以做类似的事情:

def f(x: Double) = 1.0 / (x + Double.MinPositiveValue)

...并避免Infinityf(0.0). 让我们尝试找到一个稍大的数字:

scala> val xs = Iterator.iterate(Double.MinPositiveValue)(_ + Double.MinPositiveValue)
xs: Iterator[Double] = non-empty iterator

scala> xs.take(10).toList
res1: List[Double] = List(4.9E-324, 1.0E-323, 1.5E-323, 2.0E-323, 2.5E-323, 3.0E-323, 3.5E-323, 4.0E-323, 4.4E-323, 4.9E-323)

好的。好的。它在增加。怎么样:

scala> xs.map(1.0 / _).take(10).toList
res2: List[Double] = List(Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity)

嗯……也许需要一段时间。我们试试看:

scala> xs.find(x => !(1.0 / x).isInfinite)

......我还在等这个。看起来它不会很快终止。

如何找到Double不会给出无限结果的最小除数?

4

1 回答 1

3

如果您要搜索,至少使用二分法进行搜索,因为那是 2 (#bits in exponent),迭代次数不应超过 1024 次。

但事实证明你不需要,因为你可以更快地通过试用找到它。它应该非常接近1/Double.MaxValue

scala> Double.MaxValue
res35: Double = 1.7976931348623157E308

scala> 1/res35
res36: Double = 5.562684646268003E-309

scala> 1/res36
res37: Double = Infinity

scala> 1/(res36+math.ulp(res36))
res38: Double = 1.7976931348623143E308

scala> res36+math.ulp(res36)
res39: Double = 5.56268464626801E-309

没那么糟糕。

于 2013-02-23T21:52:43.797 回答