Skip to content

Commit dae780d

Browse files
committed
Limit sqrt result when prec limit is set
1 parent 6a718b3 commit dae780d

File tree

2 files changed

+5
-0
lines changed

2 files changed

+5
-0
lines changed

lib/bigdecimal.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@ def sqrt(prec)
189189
raise FloatDomainError, "sqrt of 'NaN'(Not a Number)" if nan?
190190
return self if zero?
191191

192+
limit = BigDecimal.limit.nonzero? if prec == 0
193+
192194
# BigDecimal#sqrt calculates at least n_significant_digits precision.
193195
# This feature maybe problematic for some cases.
194196
n_digits = n_significant_digits
@@ -202,6 +204,7 @@ def sqrt(prec)
202204
precs.reverse_each do |p|
203205
y = y.add(x.div(y, p), p).div(2, p)
204206
end
207+
y = y.mult(1, limit) if limit
205208
y.mult(BigDecimal("1e#{ex}"), precs.first)
206209
end
207210
end

test/bigdecimal/test_bigdecimal.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2459,13 +2459,15 @@ def test_sqrt_exp_log_pow_with_limit
24592459
x = BigDecimal(123).div(7, prec)
24602460
y = BigDecimal(456).div(11, prec)
24612461
sqrt = BigMath.sqrt(x, prec)
2462+
sqrt_lim = sqrt.mult(1, limit)
24622463
exp = BigMath.exp(x, prec)
24632464
log = BigMath.log(x, prec)
24642465
pow = x.power(y, prec)
24652466
pow_lim = x.power(y, limit)
24662467
BigDecimal.save_limit do
24672468
BigDecimal.limit(limit)
24682469
assert_equal(sqrt, BigMath.sqrt(x, prec))
2470+
assert_equal(sqrt_lim, BigMath.sqrt(x, 0))
24692471
assert_equal(exp, BigMath.exp(x, prec))
24702472
assert_equal(log, BigMath.log(x, prec))
24712473
assert_equal(pow, x.power(y, prec))

0 commit comments

Comments
 (0)