我想计算10增加到功率减去m
。除了使用数学函数pow(10, -m)
之外,有没有快速有效的方法呢?
我从SO中向c ++专家提出这样一个简单的问题是,正如你所知,就像基数2,10一样,它也是一个特殊的基础。如果某个值n
乘以10的幂减去m
,则相当于将n的小数点向左移动m次。我认为它必须是一种快速有效的应对方式。
对于浮点m,只要您的标准库实现写得很好,那么pow
将是高效的。
如果m是一个整数,并且你暗示它是,那么你可以使用一组预先计算的值。
如果该例程是代码中的瓶颈,那么您应该只担心这种事情。也就是说,如果对该例程的调用占总运行时间的很大一部分。
Ten不是二进制机器上的特殊值,只有两个是。使用pow
或exponentiation by squaring。
遗憾的是,没有快速有效的方法来使用IEEE 754浮点表示来计算它。获得结果的最快方法是为您关心的m
的每个值构建一个表,然后只执行查找。
如果有一种快速有效的方法,那么我确定你的CPU支持它,除非你在嵌入式系统上运行,在这种情况下我希望pow(...)实现写得很好。
10对我们来说很特别,因为我们大多数人都有十个手指。计算机只有两位数,所以2对他们来说是特殊的。 :)
使用查找表不能超过1000个浮点数,特别是如果m是整数。
如果你可以在很长一段时间内使用log n而不是n来操作,那么你可以节省时间,而不是
n = pow(10*n,-m)
你现在必须计算(使用定义l = log10(n))
l = -m*(l+1)
还有一些想法可能会引导您进一步解决问题......
IEEE 754规定了一堆浮点格式。那些广泛使用的是二元的,这意味着基数10在任何方面都不是特殊的。这与你的假设“10也是一个特殊的基础”相反。
有趣的是,IEEE 754-2008确实添加了十进制浮点格式(decimal32
和朋友)。但是,我还没有遇到过那些硬件实现。
在任何情况下,您不应该在对其进行分析之前对代码进行微观优化,并确定这确实是瓶颈。
如果m是整数,则计算10 ^ m并计算逆(1/10 ^ m)。通过平方时间使用取幂将与log2(m)成比例。使用float,max m将接近1000,因此您可以通过平方使用取幂来预先计算并使用查找表。