测试浮点近似相等
以下是什么处理?
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.1
,0.2
和 0.3
都没有在计算机中表示为那些值 - 1//10
,2//10
和 3//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
版本。