class BigDecimal

def sqrt(prec)


Result has at least prec significant digits.

Returns the square root of the value.
def sqrt(prec)
  Internal.validate_prec(prec, :sqrt, accept_zero: true)
  return Internal.infinity_computation_result if infinite? == 1
  raise FloatDomainError, 'sqrt of negative value' if self < 0
  raise FloatDomainError, "sqrt of 'NaN'(Not a Number)" if nan?
  return self if zero?
  limit = BigDecimal.limit.nonzero? if prec == 0
  # BigDecimal#sqrt calculates at least n_significant_digits precision.
  # This feature maybe problematic for some cases.
  n_digits = n_significant_digits
  prec = [prec, n_digits].max
  ex = exponent / 2
  x = _decimal_shift(-2 * ex)
  y = BigDecimal(Math.sqrt(x.to_f))
  precs = [prec + BigDecimal.double_fig]
  precs << 2 + precs.last / 2 while precs.last > BigDecimal.double_fig
  precs.reverse_each do |p|
    y = y.add(x.div(y, p), p).div(2, p)
  end
  y = y.mult(1, limit) if limit
  y._decimal_shift(ex)
end