不同的等式[DenseVector]类型用于不同的数值公差

时间:2017-09-27 01:33:37

标签: scala scalatest scala-breeze scalactic

我为DenseVectors编写了一个scalactic相等提供程序,它使用breeze closeTo方法来检查向量中的每个double是否足够接近。

 implicit val vectorEquality: Equality[DenseVector[Double]] = new Equality[DenseVector[Double]] {
    def areEqual(a: DenseVector[Double], b: Any): Boolean = {
      b match {
        case b: DenseVector[Double] => (a.valuesIterator zip b.valuesIterator).forall(p =>
          closeTo(p._1, p._2))
        case _ => false
      }
    }

当我在测试中使用这个相等时,有没有办法控制closeTo的接近程度?有时我想在测试中“应该是平等的”意味着相等到2位小数,有时我想要更严格的要求。

1 个答案:

答案 0 :(得分:0)

是的,您可以控制亲密度,因为closeTo在Implicits中定义了第三个名为tolerance的参数。

class RichDouble(x: Double) {
    def closeTo(y: Double, tol: Double=1E-5) = {
      (math.abs(x - y) / (math.abs(x) + math.abs(y) + 1e-10) < tol);
    }
    def isDangerous = x.isNaN || x.isInfinite
}

示例可以在Chi Squared distribution

的测试中找到
def paramsClose(p: Double, b: Double) = breeze.numerics.closeTo(p, b, 5E-2)