File tree Expand file tree Collapse file tree 2 files changed +6
-7
lines changed Expand file tree Collapse file tree 2 files changed +6
-7
lines changed Original file line number Diff line number Diff line change @@ -20,21 +20,19 @@ def sqrt(prec)
20
20
raise FloatDomainError , 'sqrt of negative value' if self < 0
21
21
raise FloatDomainError , "sqrt of 'NaN'(Not a Number)" if nan?
22
22
23
- ten = BigDecimal ( 10 )
24
23
n_digits = n_significant_digits
25
24
prec = [ prec , n_digits ] . max
26
25
27
26
if n_digits < prec / 2
28
27
# Fast path for sqrt(16e100) => 4e50
29
- base = ten ** ( ( n_digits + 1 ) / 2 - exponent / 2 )
30
- n = self * base * base
28
+ ex = ( n_digits + 1 ) / 2 - exponent / 2
29
+ n = ( self * BigDecimal ( "1e #{ 2 * ex } " ) ) . to_i
31
30
sqrt = Integer . sqrt ( n )
32
- return BigDecimal ( sqrt ) . div ( base , prec ) if sqrt * sqrt == n
31
+ return BigDecimal ( sqrt ) * BigDecimal ( "1e #{ - ex } " ) if sqrt * sqrt == n
33
32
end
34
33
35
34
ex = prec + BigDecimal . double_fig - exponent / 2
36
- base = ten ** ex
37
- sqrt = Integer . sqrt ( self * base * base )
38
- BigDecimal ( sqrt ) . div ( base , prec + BigDecimal . double_fig )
35
+ sqrt = Integer . sqrt ( self * BigDecimal ( "1e#{ 2 * ex } " ) )
36
+ BigDecimal ( sqrt ) * BigDecimal ( "1e#{ -ex } " )
39
37
end
40
38
end
Original file line number Diff line number Diff line change @@ -1186,6 +1186,7 @@ def test_sqrt_bigdecimal
1186
1186
assert_equal ( BigDecimal ( '11.1' ) , BigDecimal ( '123.21' ) . sqrt ( 100 ) )
1187
1187
assert_equal ( BigDecimal ( '11e20' ) , BigDecimal ( '121e40' ) . sqrt ( 100 ) )
1188
1188
assert_in_epsilon ( Math . sqrt ( 121e41 ) , BigDecimal ( '121e41' ) . sqrt ( 100 ) )
1189
+ assert_in_epsilon ( Math . sqrt ( 2e100 ) , BigDecimal ( '2e100' ) . sqrt ( 10 ) )
1189
1190
end
1190
1191
1191
1192
def test_sqrt_5266
You can’t perform that action at this time.
0 commit comments