Skip to content

Commit 03037ba

Browse files
committed
update ULPError
1 parent 30430c4 commit 03037ba

File tree

1 file changed

+16
-25
lines changed

1 file changed

+16
-25
lines changed

test/common/ULPError.jl

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,35 @@
11
module ULPError
22
export ulp_error, ulp_error_maximum
3-
@noinline function throw_invalid()
4-
throw(ArgumentError("invalid"))
5-
end
63
function ulp_error(accurate::AbstractFloat, approximate::AbstractFloat)
74
# the ULP error is usually not required to great accuracy, so `Float32` should be precise enough
8-
zero_return = Float32(0)
9-
inf_return = Float32(Inf)
10-
let accur_is_nan = isnan(accurate), approx_is_nan = isnan(approximate)
5+
zero_return = 0f0
6+
inf_return = Inf32
7+
# handle floating-point edge cases
8+
if !(isfinite(accurate) && isfinite(approximate))
9+
accur_is_nan = isnan(accurate)
10+
approx_is_nan = isnan(approximate)
1111
if accur_is_nan || approx_is_nan
12-
if accur_is_nan === approx_is_nan
13-
return zero_return
12+
return if accur_is_nan === approx_is_nan
13+
zero_return
14+
else
15+
inf_return
1416
end
15-
return inf_return
1617
end
17-
end
18-
if isinf(accurate) || iszero(accurate) # handle floating-point edge cases
19-
if isinf(accurate)
20-
if isinf(approximate) && (signbit(accurate) == signbit(approximate))
21-
return zero_return
18+
if isinf(approximate)
19+
return if isinf(accurate) && (signbit(accurate) == signbit(approximate))
20+
zero_return
21+
else
22+
inf_return
2223
end
23-
return inf_return
2424
end
25-
# `iszero(accurate)`
26-
if iszero(approximate)
27-
return zero_return
28-
end
29-
return inf_return
3025
end
3126
# assuming `precision(BigFloat)` is great enough
3227
acc = if accurate isa BigFloat
3328
accurate
3429
else
3530
BigFloat(accurate)::BigFloat
3631
end
37-
err = abs(Float32((approximate - acc) / eps(approximate))::Float32)
38-
if isnan(err)
39-
@noinline throw_invalid() # unexpected
40-
end
41-
err
32+
abs(Float32((approximate - acc) / eps(approximate))::Float32)
4233
end
4334
function ulp_error(accurate::Acc, approximate::App, x::AbstractFloat) where {Acc, App}
4435
acc = accurate(x)

0 commit comments

Comments
 (0)