【问题标题】:ScalaTest - check for "almost equal" for floats and objects containing floats [duplicate]ScalaTest - 检查浮点数和包含浮点数的对象的“几乎相等”[重复]
【发布时间】:2015-07-08 10:32:18
【问题描述】:

在为浮点数或包含浮点数的对象(如向量或矩阵)编写测试时,我经常想测试的不是相等,而是“几乎相等”(差异允许为一些 epsilon)。

当使用ScalaTest FunSuite时,通常写成assert(xxx == yyy)。有了浮点数和点赞,我可以写 assert(math.abs(xxx - yyy)<epsilon),但我没有得到 ScalaTest assert macro 的好功能,即作为失败消息的一部分报告比较值。

如何在 ScalaTest 中执行浮点“几乎相等”的测试,以便在测试失败时将值写入失败消息的一部分?

测试示例:

import org.scalatest.FunSuite

class FloatTest extends FunSuite {
  test("Testing computations") {
    import math._
    assert(sin(Pi/4)==sqrt(0.5))
    assert(sin(Pi)==0)
  }
}

【问题讨论】:

标签: scala floating-point scalatest


【解决方案1】:

可以使用TolerantNumerics 和使用=== 代替== 来完成。

import org.scalactic.TolerantNumerics
import org.scalatest.FunSuite

class FloatTest extends FunSuite {

  val epsilon = 1e-4f

  implicit val doubleEq = TolerantNumerics.tolerantDoubleEquality(epsilon)

  test("Testing computations") {
    import math._
    assert(sin(Pi / 4) === sqrt(0.5))
    assert(sin(Pi) === 0.0)
  }
}

对于您自己的类型,您可以定义自己的 Equality[T] 子类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2016-11-14
    • 2017-09-30
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多