ScalaTest - 测试具有误差范围的两个浮点数组之间的相等性

Joh*_*n S 8 floating-point scala scalatest

假设我有一个函数返回一个双精度数组.我想测试这个函数并手动计算出正确的值.然而,由于它是浮点数,我无法进行直接比较,因此ScalaTest有任何甜蜜的语法使我能够将双数组与epsilion /误差余量进行比较吗?

谢谢

Joh*_*n S 11

好吧,我担心ScalaTest中没有很好的语法,我会用一个非常基本的解决方案接受我自己的答案.

val Eps = 1e-3 // Our epsilon

val res = testObject.test // Result you want to test.
val expected = Array(...) // Expected returning value.

res.size should be (expected.size)

for (i <- 0 until res.size) res(i) should be (expected(i) +- Eps)
Run Code Online (Sandbox Code Playgroud)

如图所示,这是有效的.然后你可以通过定义一个隐式方法使它变得更好.

  • 在`org.scalactic.Tolerance`中找到它但在使用`org.scalatest.Matchers时添加到范围内 (4认同)

dk1*_*k14 5

怎么样:

 import Inspectors._
 import scala.math._

 forExactly(max(a1.size, a2.size), a1.zip(a2)){case (x, y) => x shouldBe (y +- eps)}
Run Code Online (Sandbox Code Playgroud)

或者你可以提供自定义相等(有一个内置的 @Suma sugested):

  import org.scalactic._

  implicit val custom = TolerantNumerics.tolerantDoubleEquality(eps)

  a1 shouldBe (a2)
Run Code Online (Sandbox Code Playgroud)