in rtl/log/luts/FixedPoint.py [0:0]
def sqrt(self):
"""Compute square-root of given number."""
if self.scaledval < 0:
raise FXdomainError
elif self.scaledval == 0:
return self
# Calculate crude initial approximation:
rt = FXnum(family=self.family,
scaled_value=(1 << (self.family.fraction_bits // 2)))
val = self.scaledval
while val > 0:
val >>= 2
rt.scaledval <<= 1
# Refine approximation by Newton iteration:
while True:
delta = (rt - self / rt) >> 1
rt -= delta
if delta.scaledval == 0: break
return rt