@@ -99,20 +99,22 @@ macro checked(expr)
9999 return esc (replace_checked! (expr))
100100end
101101
102- macro check (expr)
102+ macro check (expr, kws ... )
103103 isexpr (expr, :call ) || error (" expected :call expression, got " ,
104104 isa (expr, Expr) ? QuoteNode (expr. head) : typeof (expr))
105105 safeexpr = copy (expr)
106106 for i = 2 : length (expr. args)
107107 safeexpr. args[i] = Expr (:call , :(CheckedArithmetic. safearg), expr. args[i])
108108 end
109+ cmpexpr = isempty (kws) ? :(val == valcmp || error (val, " is not equal to " , valcmp)) :
110+ :(isapprox (val, valcmp; $ (esc (kws... ))) || error (val, " is not approximately equal to " , valcmp))
109111 return quote
110112 local val = $ (esc (expr))
111113 local valcmp = CheckedArithmetic. safeconvert (typeof (val), $ (esc (safeexpr)))
112114 if ismissing (val) && ismissing (valcmp)
113115 val
114116 else
115- val == valcmp || error (val, " is not equal to " , valcmp)
117+ $ cmpexpr
116118 val
117119 end
118120 end
@@ -147,6 +149,8 @@ safearg_type(::Type{Float32}) = Float64
147149safearg_type (:: Type{Float16} ) = Float64
148150safearg_type (:: Type{T} ) where T<: Base.TwicePrecision = T
149151
152+ safearg_type (:: Type{<:Rational} ) = Float64
153+
150154"""
151155 xsafe = CheckedArithmetic.safearg(x)
152156
0 commit comments