【问题标题】:Is there any way to compute 1.01^x without loops, using only integer add, mul, sub, div, exp?有没有办法在没有循环的情况下计算 1.01^x,只使用整数 add、mul、sub、div、exp?
【发布时间】:2016-12-01 01:53:48
【问题描述】:

有没有什么方法可以实现Uint256 -> Uint256函数f(x) = floor(1.01 ^ x),只使用固定数量的操作addmulsubdivexp,所有这些都只能对整数进行运算?

【问题讨论】:

  • 但是,如果有(很有可能)输出的浮点部分,你想做什么?我认为 ALU 基本上是计算机用来计算指数的工具,所以这是一个已知问题。
  • 我赞成你的问题,希望你能得到你想要的答案。
  • 您是否必须能够处理整个 int256 范围而不会溢出,即如果结果可以适合 int256,那么您必须能够仅使用这些操作并且仅使用 int256 变量来计算它? FWIW,一个查找表需要 17833 个条目
  • 愚蠢的问题:Int256 是采用 [0..255] 中的值的类型,还是使用 256 位表示整数的类型?还是别的什么?
  • 还有签名与否?和标准的二进制补码在是的情况下?如果是 256 位,我认为不使用循环没有任何意义,除非您想直接用芯片而不是程序来实现这一点

标签: algorithm math language-agnostic


【解决方案1】:

使用牛顿二项式级数

(1+h)^x = 1+x*h + x*(x-1)/2*h^2 + x*(x-1)*(x-2)/6*h^3 + ...
        = 1 + x*h*(1+(x-1)*h/2*(1+(x-2)*h/3*(1+...)))

要获得终止计算,首先必须减少 x,我认为是 log(2)/log(1.01) 的倍数。

基本上,在中间结果中,您必须使用某种定点算法。

【讨论】:

  • 操作的问题说它只能对整数进行操作。那么自 h=0.01 以来是否允许 x*h
  • 允许除以 100。
  • 哦,也许我明白了
  • 整数舍入目前不是主要问题。收敛是,即少量项提供足够准确的结果。对此没有任何想法。
  • 啊,我一开始没有得到你的答案,我认为你的编辑意味着它不起作用。后来我什至问了一个类似的问题。不过,它工作正常。谢谢。
【解决方案2】:

我会尝试定点。假设您的 Int256 是无符号 8 位整数,然后尝试使用 8.88.168.32 固定格式。取决于您需要什么精度。

让我们将数字重写为a.b 格式并假设8.168.8 忽略了太多1.01 二进制数)所以你得到了:

1.01^x = (1+0.01*65536/65536)^x = (1+655/65536)^x
a=1
b=655

现在只需计算整数pow,例如通过平方计算幂:

结果然后转换回整数,所以要么

  • floor(仅使用 a
  • round(如果b>32767,则增加a

为了避免循环,只需通过平方成几行复制粘贴行(每个位一个)来编码功率。

顺便说一句,如果您意识到自己正在乘以,则可以使用 +,<< 来完成:

1.01dec = 1.0000001010001111 bin

所以你可以为每个二进制文件1shiftadd 而不是mul,以防mul 是一个问题......

【讨论】:

    猜你喜欢
    • 2012-03-31
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2013-09-03
    • 2019-01-18
    • 2020-12-20
    相关资源
    最近更新 更多