Skip to content

Commit 025024f

Browse files
Update op_dd_dd.jl sqrt
1 parent d3d4e0c commit 025024f

File tree

1 file changed

+9
-27
lines changed

1 file changed

+9
-27
lines changed

src/math/ops/op_dd_dd.jl

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -55,34 +55,16 @@ end
5555
return zhi, zlo
5656
end
5757

58-
5958
function sqrt_dd_dd(x::Tuple{T,T}) where {T<:IEEEFloat}
60-
hi, lo = x
61-
(isnan(hi) | iszero(hi)) && return x
62-
signbit(hi) && throw(DomainError("sqrt(x) expects x >= 0"))
63-
64-
half = T(0.5)
65-
dhalf = (half, zero(T))
66-
67-
r = inv(sqrt(hi))
68-
h = (hi * half, lo * half)
69-
70-
r2 = mul_fpfp_dd(r, r)
71-
hr2 = mul_dddd_dd(h, r2)
72-
radj = sub_fpdd_dd(half, hr2)
73-
radj = mul_ddfp_dd(radj, r)
74-
r = add_fpdd_dd(r, radj)
75-
76-
r2 = mul_dddd_dd(r, r)
77-
hr2 = mul_dddd_dd(h, r2)
78-
radj = sub_fpdd_dd(half, hr2)
79-
radj = mul_dddd_dd(radj, r)
80-
r = add_dddd_dd(r, radj)
81-
82-
r = mul_dddd_dd(r, x)
83-
isnan(HI(r)) && return DoubleFloat{T}(sqrt(hi), zero(T)) # subnormal numbers
84-
85-
return r
59+
iszero(HI(x))) && return x
60+
signbit(HI(x)) && throw(DomainError("sqrt(x) expects x >= 0")) # maybe we can remove this check? It will return nan anyway.
61+
62+
ahi, alo = HILO(x)
63+
s = sqrt(ahi)
64+
d = fma(-s, s, ahi) # ahi=s*s+d, same order of magnitude than alo, so we can add alo safely below:
65+
d += alo # ahi+alo = s*s+d = s*s*(1+d/(s*s)) ==> sqrt(ahi+alo) = s*sqrt(1+d/s2) approx= s*(1+d/(2s2)) = s + d/(2*s)
66+
d = d/(s+s)
67+
return s,d
8668
end
8769

8870
#=

0 commit comments

Comments
 (0)