计算n次10的快速方法增加到负m的幂

时间:2011-05-27 06:58:03

标签: c++ math pow

我想计算10增加到功率减去m。除了使用数学函数pow(10, -m)之外,有没有快速有效的方法呢?

我从SO中向c ++专家提出这样一个简单的问题是,正如你所知,就像基数2,10一样,它也是一个特殊的基础。如果某个值n乘以10的幂减去m,则相当于将n的小数点向左移动m次。我认为它必须是一种快速有效的应对方式。

9 个答案:

答案 0 :(得分:5)

对于浮点m,只要标准库实现编写得很好,pow就会有效。

如果m是一个整数,并且你暗示它是,那么你可以使用一组预先计算的值。

如果该例程是代码中的瓶颈,那么您应该只担心这种事情。也就是说,如果对该例程的调用占总运行时间的很大一部分。

答案 1 :(得分:4)

Ten不是二进制机器上的特殊值,只有两个是。使用powexponentiation by squaring

答案 2 :(得分:2)

遗憾的是,没有快速有效的方法来使用IEEE 754浮点表示来计算它。获得结果的最快方法是为您关心的m的每个值构建一个表,然后只执行查找。

答案 3 :(得分:0)

如果有一种快速有效的方法,那么我确定你的CPU支持它,除非你在嵌入式系统上运行,在这种情况下我希望那些pow( ......)实施得很好。

10对我们来说很特别,因为我们大多数人都有十个手指。计算机只有两位数,所以2对他们来说是特殊的。 :)

答案 4 :(得分:0)

使用查找表不能超过1000个浮点数,尤其是如果m是整数。

答案 5 :(得分:0)

IEEE 754规定了一堆浮点格式。那些广泛使用的是二元的,这意味着基数10在任何方面都不是特殊的。这与你的假设相反,“10也是一个特殊的基础”。

有趣的是,IEEE 754-2008确实添加了十进制浮点格式(decimal32和朋友)。但是,我还没有遇到过那些硬件实现。

在任何情况下,您都不应该在对代码进行分析之前对其进行微观优化,并确定这确实是瓶颈。

答案 6 :(得分:0)

如果你可以在很长一段时间内使用log n代替n,那么你可以节省时间,而不是

n = pow(10*n,-m)

你现在必须计算(使用定义l = log10(n))

l = -m*(l+1)

答案 7 :(得分:0)

还有一些想法可能会引导您进一步解决方案......

  1. 如果您对此感兴趣 优化算法级别你 可能会寻找并行化的 方法

  2. 你可以加快速度 系统/建筑层面使用Ipp (对于英特尔处理器),或者AMD AMD核心数学库(ACML)

  3. 使用图形的强大功能 卡可能是另一种方式(例如,NVIDEA卡的CUDA)

  4. 我认为值得一看 OpenCL的

答案 8 :(得分:0)

如果m是整数,则计算10 ^ m并计算逆(1/10 ^ m)。 通过平方时间使用取幂将与log2(m)成比例。 使用float,max m将接近1000,因此您可以通过平方使用取幂来预计算并使用查找表。