【问题标题】:Scala Has Infinity but no Infinitesimal. Why?Scala 有无穷大,但没有无穷小。为什么?
【发布时间】:2023-03-16 07:48:02
【问题描述】:

打开一个 Scala 解释器。

scala> 1E-200 * 1E-200    
res1: Double = 0.0

scala> 1E200 * 1E200    
res2: Double = Infinity

一个非常大的产品价值评估为无穷大。 一个非常小的值计算为零。

为什么不对称并创建一个称为 Infinitesimal 的东西?

【问题讨论】:

  • 所有问题发给IEEE。可怜的 Scala 与它无关。

标签: scala infinity


【解决方案1】:

基本上,这与浮点数的工作方式有关,这与您的处理器有关,而不是 scala。这个小数字将非常小,以至于最接近的表示对应于 +0(正零),因此它下溢到 0.0。大数将溢出任何有效表示并被替换为 +inf(正无穷大)。请记住,浮点数是固定精度估计。如果你想要一个更精确的系统,你可以使用http://www.scala-lang.org/api/2.11.8/#scala.math.BigDecimal

【讨论】:

  • Infinitesimal 可用于捕获下溢事件,就像 Infinite 用于捕获溢出事件一样
  • 这不符合浮点作为估计的角色。虽然 IEEE 754 中描述了下溢异常,但它表示精度损失,而不是存在特殊值。有很多事情,比如平等测试,浮动不是为了。让 0.0 == 1E-200 * 1E-200 可靠地为假与此相反。 (已编辑)
  • ```scala> val x = 1E200 * 1E200 x: Double = Infinity scala> val y = 1E200 * 1E200 y: Double = Infinity scala> x == y res8: Boolean = true scala> val x1 = 1E-200 * 1E-200 x1: Double = 0.0 scala> val y1 = 1E-200 * 1E-200 y1: Double = 0.0 scala> x1 == y1 res9: Boolean = true
  • 忽略之前的评论。现在无法编辑。就像一个兴趣点:scala> 1E200 * 1E200 == 1E199 * 1E199 res0: Boolean = true 这在数学上显然是不正确的。 scala> 1E-200 * 1E-200 == 1E199 * 1E199 res1: Boolean = false scala> 1E-200 * 1E-200 == 1E-199 * 1E-199 res2: Boolean = true 这在数学上显然也是不正确的。但我同意浮点数被设计为一种近似机制,而不是在非常大或非常小的值下数学上正确的东西。
【解决方案2】:

Scala,就像 Java 一样,遵循IEEE specification for floating point numbers,它没有“无穷小”。我不太确定无穷小无论哪种方式都有意义,因为它们没有数字的数学解释。

【讨论】:

  • 在我看来,无穷小可能是一组值太小而无法放入有限数量的位中,从而导致精度有限。 Infinitesimal 确实对微积分极限有解释 => 做一些尽可能小的东西而不让它变成零。
猜你喜欢
  • 2022-08-12
  • 2016-10-16
  • 1970-01-01
  • 2012-02-09
  • 2018-12-03
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多