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

问题描述 投票:2回答:9

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

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

c++ math pow
9个回答
5
投票

对于浮点m,只要您的标准库实现写得很好,那么pow将是高效的。

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

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


4
投票

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


2
投票

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


0
投票

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

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


0
投票

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


0
投票

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

n = pow(10*n,-m)

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

l = -m*(l+1)

0
投票

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

  1. 如果您对算法级别的优化感兴趣,可以寻找并行化方法。
  2. 您可以使用Ipp(对于Intel处理器)加速系统/架构级别,例如适用于AMD的AMD核心数学库(ACML)
  3. 使用显卡的电源可能是另一种方式(例如NVIDEA卡的CUDA)
  4. 我认为看看OpenCL也是值得的

0
投票

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.