gpt4 book ai didi

scala - 如何找到不会产生无限结果的最小 `Double` 除数?

转载 作者:行者123 更新时间:2023-12-04 05:09:31 25 4
gpt4 key购买 nike

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不会给出无限结果的除数?

最佳答案

如果你要搜索,至少用二分法搜索,它应该不超过 1024 次迭代,因为它是 2(指数中的#bits)。

但事实证明,您不需要这样做,因为您可以通过试用更快地找到它。应该非常接近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

没那么糟糕。

关于scala - 如何找到不会产生无限结果的最小 `Double` 除数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15045920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com