ScalaTest - 检查 "almost equal" 是否有浮点数和包含浮点数的对象

ScalaTest - check for "almost equal" for floats and objects containing floats

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

当使用 ScalaTest FunSuite, one normally writes assert(xxx == yyy). With floats and likes I can write assert(math.abs(xxx - yyy)<epsilon), but then I do not get the nice feature of the ScalaTest assert macro 作为失败消息的一部分报告比较值时。

如何在 ScalaTest 中执行 float "almost equality" 测试,以便在测试失败时,将值作为失败消息的一部分写入?

测试示例:

import org.scalatest.FunSuite

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

可以使用 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].

子类