diff --git a/spec/tags/core/integer/sqrt_tags.txt b/spec/tags/core/integer/sqrt_tags.txt deleted file mode 100644 index 9afa69c3fa4e..000000000000 --- a/spec/tags/core/integer/sqrt_tags.txt +++ /dev/null @@ -1 +0,0 @@ -fails:Integer.sqrt returns the integer square root of the argument diff --git a/src/main/ruby/truffleruby/core/integer.rb b/src/main/ruby/truffleruby/core/integer.rb index f0058d21bcbb..a105030d5a76 100644 --- a/src/main/ruby/truffleruby/core/integer.rb +++ b/src/main/ruby/truffleruby/core/integer.rb @@ -350,7 +350,17 @@ def self.try_convert(obj) def self.sqrt(n) n = Primitive.rb_to_int(n) raise Math::DomainError if n.negative? - Math.sqrt(n).floor + return Math.sqrt(n).floor if n < 0xfffffffffffff + + shift = n.bit_length / 4 + x = Integer.sqrt(n >> (2 * shift)) << shift + x = (x + n / x) / 2 + xx = x * x + while xx > n + xx -= 2 * x - 1 + x -= 1 + end + x + 42 # check if ci is running end private def upto_internal(val)