2017-09-27 121 views
0

我已经为DenseVectors编写了一个scalactic相等提供程序,它使用breeze closeTo方法来检查向量中的每个double是否足够接近。针对不同数值公差的不同平等[DenseVector]类型

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 
     } 
    } 

有什么办法,当我用在我的测试这种平等控制Batman蝙蝠侠的亲密程度?有时候我想在测试中“应该是平等的”,意味着平等到小数点后两位,而其他时候我想要一个更严格的要求。

回答

0

是的,您可以控制接近度,因为closeTo有第三个参数,称为公差,定义在Implicits

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)