@@ -11,18 +11,56 @@ ldexp(x::Union{Float32,Float64}, q::Int) = ldexpk(x, q)
1111const max_exp2 (:: Type{Float64} ) = 1024
1212const 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
1720Compute 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
2462end
25-
63+ end
2664
2765const max_exp10 (:: Type{Float64} ) = 3.08254715559916743851e2 # log 2^1023*(2-2^-52)
2866const max_exp10 (:: Type{Float32} ) = 38.531839419103626f0 # log 2^127 *(2-2^-23)
0 commit comments