Solidity 怎么计算一个数的平方根?

如题,在智能合约语言 如果使用 Solidity 怎么获得一个数的平方根? 有没有相关的API。

请先 登录 后评论

最佳答案 2020-01-14 16:53

Solidity 对于数学公式的支持比较弱, 对于整型,仅支持:

  • 比较运算符: <= , < , == , != , >= , > (返回布尔值)
  • 位运算符: & , | , ^ (异或), ~ (位取反)
  • 移位运算符: << (左移位) , >> (右移位)
  • 算数运算符: + , - , 一元运算 - , 一元运算 + , * , / , % (取余或叫模运算) , ** (幂)

因此在 Solidity文档 里找不到对应的API。

如果可以使用以下代码实现:

pragma solidity ^0.4.18;
contract  MathSqrt {
  function sqrt(uint x) public pure returns(uint) {
    uint z = (x + 1 ) / 2;
    uint y = x;
    while(z < y){
      y = z;
      z = ( x / z + z ) / 2;
    }
    return y;
  }
}

这个计算会向下取整,即: 5的平方根是2。

如果需要严格求平方根,可以加一个判断:

    uint b = sqrt(a);
    require(b * b == a, "无效平方根");
请先 登录 后评论

其它 0 个回答