2017-09-27 103 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)