测试浮点近似相等

以下是什么处理?

julia> @test 0.1 + 0.2 == 0.3
Test Failed
  Expression: 0.1 + 0.2 == 0.3
   Evaluated: 0.30000000000000004 == 0.3
ERROR: There was an error during testing
 in record(::Base.Test.FallbackTestSet, ::Base.Test.Fail) at ./test.jl:397
 in do_test(::Base.Test.Returned, ::Expr) at ./test.jl:281

这个错误是由于 0.10.20.3 都没有在计算机中表示为那些值 - 1//102//103//10。相反,它们通过非常接近的值来近似。但正如上面的测试失败所示,当将两个近似值加在一起时,结果可能会比可能的稍微差一些。这个主题还有很多内容 ,这里不能涵盖。

但我们并不是运气不好! 为了测试舍入到浮点数和浮点运算的组合是近似正确的,即使不精确,我们也可以使用 isapprox 函数(对应于运算符)。所以我们可以改写我们的测试

julia> @test 0.1 + 0.2 ≈ 0.3
Test Passed
  Expression: 0.1 + 0.2 ≈ 0.3
   Evaluated: 0.30000000000000004 isapprox 0.3

当然,如果我们的代码完全错误,测试仍然会发现:

julia> @test 0.1 + 0.2 ≈ 0.4
Test Failed
  Expression: 0.1 + 0.2 ≈ 0.4
   Evaluated: 0.30000000000000004 isapprox 0.4
ERROR: There was an error during testing
 in record(::Base.Test.FallbackTestSet, ::Base.Test.Fail) at ./test.jl:397
 in do_test(::Base.Test.Returned, ::Expr) at ./test.jl:281

isapprox 函数使用基于数字大小的 heuristics 和浮点类型的精度来确定要容忍的错误量。它并不适合所有情况,但它最适用,并且可以节省大量工作来实现自己的 isapprox 版本。