V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Features
V2EX  ›  程序员

求教 solidity 中,计算幂的问题

  •  
  •   Features · 154 天前 · 881 次点击
    这是一个创建于 154 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想要计算 20128 的 n 次方

    比如 20128 ** 180

    这个数明显超过 int256 了
    运行也会报错

    应该怎样做才能保证计算能正常进行?

    有什么优雅的办法吗?
    第 1 条附言  ·  154 天前
    就是得到一个复利计算的结果
    计算的结果最后要 ➗ 10000 ** 180
    3 条回复    2022-09-06 10:09:26 +08:00
    nyxsonsleep
        1
    nyxsonsleep  
       154 天前
    调用 bigint
    harrytse94
        2
    harrytse94  
       153 天前 via Android   ❤️ 2
    没有好的办法,这两种比较常见
    1 将幂运算的底数或者指数缩小,一般底数都有对应的放大,在需求内将底数的放大倍数缩小。或者将指数缩小,比如原来是秒指数,变成分指数就缩小了 60 倍
    举例 按秒计算的利率为 1.0000000006 一天 86400 秒
    正常计算是 10000000006 ** 86400
    改成按分计算,分利率比秒利率大,假设 1.000000005 一天 1400 分
    计算就变成了 10000000050 ** 1440
    由于分利率比秒利率大了一个数量级,因此可以把底数缩小,计算就变成了
    1000000005 ** 1440

    2 一般这个幂计算的结果不是最终结果,还需要除以放大倍数,比如计算复利 1.000003 ** 365 ,通常计算是是 (10000030) ** 365 / (10**7 ** 364) 可以在这个过程中拆分,比如
    s1 = (10000030) ** 100 / (10**7 ** 99)
    s2 = (s1) ** 100 / (10**7 ** 99)
    s3 = (s1) ** 100 / (10**7 ** 99)
    s4 = (s1) ** 65 / (10**7 ** 64)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   1350 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 18:52 · PVG 02:52 · LAX 10:52 · JFK 13:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.