ScalaTest - 检查浮点数和包含浮点数的对象的"几乎相等"

Sum*_*uma 12 floating-point scala scalatest

在使用浮点数或包含浮点数的对象(如向量或矩阵)编写操作的测试时,我经常想要测试不是为了相等,而是为了"几乎相等"(差异允许是某些epsilon).

使用ScalaTest FunSuite时,通常会写入assert(xxx == yyy).随着浮动和喜欢我可以写assert(math.abs(xxx - yyy)<epsilon),但后来我没有得到ScalaTest断言宏的好功能,报告比较值作为失败消息的一部分.

如何在ScalaTest中执行float"几乎相等"的测试,以便在测试失败时将值写为失败消息的一部分?

测试示例:

import org.scalatest.FunSuite

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

Sum*_*uma 21

它可以使用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)
  }
}
Run Code Online (Sandbox Code Playgroud)

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