測試浮點近似相等
以下是什麼處理?
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
版本。