Skip to content

Commit 6e6cf88

Browse files
committed
Improve exp2 performance
1 parent 6638284 commit 6e6cf88

File tree

1 file changed

+43
-5
lines changed

1 file changed

+43
-5
lines changed

src/exp.jl

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,56 @@ ldexp(x::Union{Float32,Float64}, q::Int) = ldexpk(x, q)
1111
const max_exp2(::Type{Float64}) = 1024
1212
const max_exp2(::Type{Float32}) = 128f0
1313

14+
const min_exp2(::Type{Float64}) = -1075
15+
const min_exp2(::Type{Float32}) = -150f0
16+
1417
"""
1518
exp2(x)
1619
1720
Compute the base-`2` exponential of `x`, that is `2ˣ`.
1821
"""
19-
function exp2(x::T) where {T<:Union{Float32,Float64}}
20-
u = expk(dmul(MDLN2(T), x))
21-
x > max_exp2(T) && (u = T(Inf))
22-
isninf(x) && (u = T(0.0))
22+
function exp2 end
23+
24+
let
25+
global exp2
26+
27+
28+
c11d = 0.4434359082926529454e-9
29+
c10d = 0.7073164598085707425e-8
30+
c9d = 0.1017819260921760451e-6
31+
c8d = 0.1321543872511327615e-5
32+
c7d = 0.1525273353517584730e-4
33+
c6d = 0.1540353045101147808e-3
34+
c5d = 0.1333355814670499073e-2
35+
c4d = 0.9618129107597600536e-2
36+
c3d = 0.5550410866482046596e-1
37+
c2d = 0.2402265069591012214
38+
c1d = 0.6931471805599452862
39+
40+
c6f = 0.1535920892f-3
41+
c5f = 0.1339262701f-2
42+
c4f = 0.9618384764f-2
43+
c3f = 0.5550347269f-1
44+
c2f = 0.2402264476f0
45+
c1f = 0.6931471825f0
46+
47+
global @inline exp2_kernel(x::Float64) = @horner x c1d c2d c3d c4d c5d c6d c7d c8d c9d c10d c11d
48+
global @inline exp2_kernel(x::Float32) = @horner x c1f c2f c3f c4f c5f c6f
49+
50+
function exp2(d::T) where {T<:Union{Float32,Float64}}
51+
q = unsafe_trunc(Int, round(d))
52+
s = d - q
53+
54+
u = exp2_kernel(s)
55+
u = T(dnormalize(dadd(T(1.0), dmul(u,s))))
56+
57+
u = ldexp2k(u, q)
58+
59+
d > max_exp2(T) && (u = T(Inf))
60+
d < min_exp2(T) && (u = T(0.0))
2361
return u
2462
end
25-
63+
end
2664

2765
const max_exp10(::Type{Float64}) = 3.08254715559916743851e2 # log 2^1023*(2-2^-52)
2866
const max_exp10(::Type{Float32}) = 38.531839419103626f0 # log 2^127 *(2-2^-23)

0 commit comments

Comments
 (0)