首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >稳固的电力运作

稳固的电力运作
EN

Ethereum用户
提问于 2016-12-03 16:38:22
回答 3查看 16.1K关注 0票数 21

稳健性是否支持2^3 =8这样的幂运算,还是应该执行多次乘法?我应该包括一个数学图书馆吗?我在官方医生身上什么都找不到。谢谢

EN

回答 3

Ethereum用户

回答已采纳

发布于 2016-12-03 16:40:27

你只需要使用**。

下面的函数计算A为B的幂。

代码语言:javascript
复制
function power(uint256 A, uint256 B) public returns (uint256){ 
        return A**B;
     }
票数 29
EN

Ethereum用户

发布于 2018-04-06 07:09:16

**是您要找的接线员。2**3 = 8。

但是在使用它的时候要有偏执--它很容易溢出。

例如..。在255到第二次幂的情况下.你可能想要的答案是65025。但是,如果使用uint8,那么实际得到的是65025 mod (2^8),或者,1。

例如:

代码语言:javascript
复制
uint8 a = 255;
uint8 b = 2;
uint8 c = a**b;

结果c等于1。

甚至下面这些都对你没有好处。由于a和b都是uint8s,因此在转换为uint256之前,结果是具有mod 2^8“特性”的uint8。

代码语言:javascript
复制
uint256 d = a**b;

再次,d等于1。

下面给出的答案是正确的,但只是因为a和b太小了。

代码语言:javascript
复制
uint256 e = uint256(a)**uint256(b);

E等于65025。

确保你安全的复杂方法在这里..。

https://stackoverflow.com/questions/199333/how-to-detect-integer-overflow

一个简单的经验法则:如果你的数字是255或更少,到32或更少的幂,你应该是好的。

记住(a^b)^c等于a^(b*c)。

所以取最大的uint8,255..。

代码语言:javascript
复制
255^255
< 256^255
= (2^8)^255
= 2^(8x255)
= 2^(2040)

这显然比“微小”uint256所能容纳的位数多(2^256-1).

代码语言:javascript
复制
255 ^ 32
< 256 ^ 32
= (2^8)^32
= 2^(8*32)
= 2^256
= one less than the maximum value of a uint256
票数 4
EN

Ethereum用户

发布于 2020-12-30 01:48:40

下面是一个基于SafeMath的实心实权函数的实现,使用递归的平方幂方法:

代码语言:javascript
复制
function pow(uint n, uint e) public pure returns (uint) {
    
    if (e == 0) {
        return 1;
    } else if (e == 1) {
        return n;
    } else {
        uint p = pow(n, e.div(2));
        p = p.mul(p);
        if (e.mod(2) == 1) {
            p = p.mul(n);
        }
        return p;
    }
}
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/10475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档