2014-11-30 7 views
6

Diciamo che ho una funzione che restituisce una matrice di doppi. Voglio testare questa funzione e ho calcolato il valore corretto a mano. Tuttavia, dato che si tratta di numeri in virgola mobile, non posso fare confronti diretti, quindi c'è una sintassi dolce di ScalaTest che mi consente di confrontare i doppi array con un margine di errore/epsilion?ScalaTest - verifica l'uguaglianza tra due array in virgola mobile con margine di errore

Grazie

+0

Possibile duplicato di [Gestione doppio in ScalaTest] (https://stackoverflow.com/questions/27809423/handling-doubles-in-scalatest) – Suma

+0

@Suma questa domanda è più vecchia di quella che hai collegato in modo tale che uno è un dup di questo –

risposta

7

Beh, come ho temuto non c'è bella sintassi in ScalaTest per questo, e accetterò la mia risposta con una soluzione molto semplice.

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) 

Come visto, funziona. Quindi puoi renderlo più bello definendo forse un metodo implicito.

+0

da dove proviene il '+ -'? –

+0

È nella libreria scalatest. –

+3

trovato in 'org.scalactic.Tolerance' ma è aggiunto nell'ambito quando si utilizza' org.scalatest.Matchers' –

4

ne dite:

import Inspectors._ 
import scala.math._ 

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

Oppure è possibile fornire custom equality (c'è una built-in uno come sugested @Suma):

import org.scalactic._ 

    implicit val custom = TolerantNumerics.tolerantDoubleEquality(eps) 

    a1 shouldBe (a2) 
+0

È bello ma è una soluzione fatta in casa, ho già fatto qualcosa di simile. Non conosci alcuna sintassi di ScalaTest per questo? Come 'a dovrebbe essere (b + - Eps)'? –

+0

Non si compila, mi dispiace. –

+0

@ dk14: che ne dici di commentare prima di rispondere a questo? – Werner