2014-11-30 10 views
6

के साथ दो फ़्लोटिंग पॉइंट सरणी के बीच समानता परीक्षण करना मान लें कि मेरे पास एक ऐसा फ़ंक्शन है जो युगल की सरणी देता है। मैं इस समारोह का परीक्षण करना चाहता हूं और हाथ से सही मूल्य की गणना कर रहा हूं। हालांकि, यह फ्लोटिंग पॉइंट नंबरों के बाद से, मैं सीधे तुलना नहीं कर सकता, इसलिए क्या स्कालाटेस्ट द्वारा कोई मीठा वाक्यविन्यास है जो मुझे एक ईपीएसलियन/त्रुटि मार्जिन के साथ डबल एरे की तुलना करने में सक्षम बनाता है?स्कैलाटेस्ट - त्रुटि मार्जिन

धन्यवाद

+0

[स्केलटेस्ट में हैंडलिंग डबल्स] का संभावित डुप्लिकेट (https://stackoverflow.com/questions/27809423/handling-doubles-in-scalatest) – Suma

+0

@ सुमा यह प्रश्न आपके द्वारा लिंक किए गए किसी से भी पुराना है ताकि कोई एक हो इस –

उत्तर

7

खैर के रूप में मुझे डर था कोई इसके लिए स्कैलाटेस्ट में अच्छा वाक्यविन्यास, और मैं अपने स्वयं के उत्तर को एक बहुत ही बुनियादी समाधान के साथ स्वीकार करूंगा।

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) 

जैसा कि देखा गया है, यह काम करता है। फिर आप इसे एक निहित विधि को परिभाषित करके इसे बेहतर बना सकते हैं।

+0

की सूचियों के लिए सहिष्णु matcher में कोई निर्मित नहीं है, जहां से '+ -' आती है? –

+0

यह सबसे पुराना पुस्तकालय में है। –

+3

ने इसे 'org.scalactic.Tolerance' में पाया लेकिन 'org.scalatest.Matchers' का उपयोग करते समय इसे दायरे में जोड़ा जाता है। –

4

के बारे में कैसे:

import Inspectors._ 
import scala.math._ 

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

या आप प्रदान कर सकते हैं custom equality (वहाँ एक built-in एक के रूप में @Suma sugested है):

import org.scalactic._ 

    implicit val custom = TolerantNumerics.tolerantDoubleEquality(eps) 

    a1 shouldBe (a2) 
+0

की डुप्ली यह अच्छी है लेकिन यह एक घर का समाधान है, मैंने पहले ही कुछ ऐसा ही किया है। आप इसके लिए किसी भी स्कालाटेस्ट वाक्यविन्यास के बारे में नहीं जानते? एक होना चाहिए (बी + - ईपीएस) '? –

+0

संकलित नहीं है, क्षमा करें। –

+0

@ dk14: इसका उत्तर देने से पहले टिप्पणी करने के बारे में कैसे? – Werner

संबंधित मुद्दे