我想计算10增加到功率减去m
。除了使用数学函数pow(10, -m)
之外,有没有快速有效的方法呢?
我从SO中向c ++专家提出这样一个简单的问题是,正如你所知,就像基数2,10一样,它也是一个特殊的基础。如果某个值n
乘以10的幂减去m
,则相当于将n的小数点向左移动m次。我认为它必须是一种快速有效的应对方式。
答案 0 :(得分:5)
对于浮点m,只要标准库实现编写得很好,pow
就会有效。
如果m是一个整数,并且你暗示它是,那么你可以使用一组预先计算的值。
如果该例程是代码中的瓶颈,那么您应该只担心这种事情。也就是说,如果对该例程的调用占总运行时间的很大一部分。
答案 1 :(得分:4)
Ten不是二进制机器上的特殊值,只有两个是。使用pow
或exponentiation 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)
还有一些想法可能会引导您进一步解决方案......
如果您对此感兴趣 优化算法级别你 可能会寻找并行化的 方法
你可以加快速度 系统/建筑层面使用Ipp (对于英特尔处理器),或者AMD AMD核心数学库(ACML)
使用图形的强大功能 卡可能是另一种方式(例如,NVIDEA卡的CUDA)
我认为值得一看 OpenCL的
答案 8 :(得分:0)
如果m是整数,则计算10 ^ m并计算逆(1/10 ^ m)。 通过平方时间使用取幂将与log2(m)成比例。 使用float,max m将接近1000,因此您可以通过平方使用取幂来预计算并使用查找表。