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