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)

...そして避けInfinityてくださいf(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分法で検索します。これは2 (指数の#bits)であるため、約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 に答える