Math in Solidity

Math in Solidity

10.10.2021

Testing Highlighting #

contract Sqrt {
  function sqrt (uint x) public pure returns (uint y) {
    if (x > 0) {
      y = 1;

      uint z = x;
      if (z >= 0x100000000000000000000000000000000) { y <<= 64; z >>= 128; }
      if (z >= 0x10000000000000000) { y <<= 32; z >>= 64; }
      if (z >= 0x100000000) { y <<= 16; z >>= 32; }
      if (z >= 0x10000) { y <<= 8; z >>= 16; }
      if (z >= 0x100) { y <<= 4; z >>= 8; }
      if (z >= 0x10) { y <<= 2; z >>= 4; }
      if (z >= 0x4) { y <<= 1; }

      // Seven iterations should be enough for 128 bits of precision
      y = (x / y + y) / 2;
      y = (x / y + y) / 2;
      y = (x / y + y) / 2;
      y = (x / y + y) / 2;
      y = (x / y + y) / 2;
      y = (x / y + y) / 2;
      y = (x / y + y) / 2;
    } else y = 0;
  }
}