測試浮點近似相等

以下是什麼處理?

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 版本。