Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ScalaTest Scalactic-自定义带公差的双等号,包括Double.NaN大小写_Scala_Nan_Equality_Scalatest_Scalactic - Fatal编程技术网

ScalaTest Scalactic-自定义带公差的双等号,包括Double.NaN大小写

ScalaTest Scalactic-自定义带公差的双等号,包括Double.NaN大小写,scala,nan,equality,scalatest,scalactic,Scala,Nan,Equality,Scalatest,Scalactic,我正在尝试创建一个自定义匹配器,该匹配器将考虑Double.NaN并对非NaN值使用容差 import org.scalactic.{Equality, TolerantNumerics} import org.scalatest.Matchers trait MoreMatchers extends Matchers { implicit def doubleEqWithNaNAndTol: Equality[Double] = new Equality[Double] {

我正在尝试创建一个自定义匹配器,该匹配器将考虑Double.NaN并对非NaN值使用容差

import org.scalactic.{Equality, TolerantNumerics}
import org.scalatest.Matchers

trait MoreMatchers extends Matchers {

  implicit def doubleEqWithNaNAndTol: Equality[Double] = new Equality[Double] {

    implicit val tolerance: Equality[Double] = TolerantNumerics.tolerantDoubleEquality(1e-6)

    def areEqual(expected: Double, actual: Any): Boolean = actual match {
      case number: Double if number.isNaN => expected.isNaN
      case _: Double => actual === expected
      case _ => false
    }

  }
不幸的是,它不起作用

assert(0.00226685508536916 === 0.0022668550853691587)  // failure - doesn't use tolerance
assert (Double.NaN === Double.NaN )  // success
如果在断言中输入容差,则如果存在NaN,则将失败

assert(0.00226685508536916 === 0.0022668550853691587 +- 1e-6)  // success
assert (Double.NaN === Double.NaN  +- 1e-6)  // failure - can't use tolerance when NaN
如果我只是像下面这样称呼它,那么它是有效的

implicit val tolerance: Equality[Double] = TolerantNumerics.tolerantDoubleEquality(1e-6)

def eq(expected: Double, actual: Double): Boolean = expected match {
    case x if x.isNaN => actual.isNaN
    case _ => actual === expected
}
然后称之为:

assert(eq(...,...))
我想知道是否有可能用第一种方法让它工作。你以前见过这种情况吗?你能提出一些解决办法吗?任何帮助都将不胜感激:)

谢谢,
ele

非常感谢eirikr@d6:),请参见中的解决方案

基本上,在上面的代码中,在比较非nan双精度时,您需要使用
公差.areEqual(预期值,数字)
,以便能够使用该比较中隐含的公差

import org.scalactic.{Equality, TolerantNumerics}
import org.scalatest.Matchers

trait MoreMatchers extends Matchers {

  implicit def doubleEqWithNaNAndTol: Equality[Double] = new Equality[Double] {

    implicit val tolerance: Equality[Double] = TolerantNumerics.tolerantDoubleEquality(1e-6)

    def areEqual(expected: Double, actual: Any): Boolean = actual match {
      case x: Double if x.isNaN => expected.isNaN
      case x: Double => tolerance.areEqual(expected, x)
      case _ => false
    }

  }
问候,, ele