【问题标题】:Fast way to compute n times 10 raised to the power of minus m计算 n 乘以 10 的负 m 次方的快速方法
【发布时间】:2011-09-03 04:19:59
【问题描述】:

我想计算 10 的幂减去m。除了使用数学函数pow(10, -m),还有什么快速高效的方法吗?

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

【问题讨论】:

  • m 是整数吗?它总是积极的吗?它的最大值是多少?除非您列出诸如此类的约束,否则您将无法获得最佳解决方案。
  • 正如一些答案所说,9+1 不是一个特殊的基础,除非你碰巧是一个人,巧合的是,结果证明有这个数量的手指。但是您的计算机没有,因此请避免以 10 为基数。仅在处理有人会实际读取数字的数据时使用它才有意义,但这仅在不超过 100 个数字时才有意义-对于此类少量,性能根本不重要。
  • 您需要积分解决方案还是浮点解决方案? nm 是编译时常量吗?

标签: c++ math pow


【解决方案1】:

对于浮点m,只要你的标准库实现写得好,那么pow就会高效。

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

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

【讨论】:

  • 你确定要写deficient吗?
  • 我手机上的@space 预测键盘做出了这个决定,谢谢!
  • 感谢您的快速回复。 pow 可以用于台式电脑。
【解决方案2】:

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

【讨论】:

  • 是的。你说得对! 10 在我们的日常生活和小学数学课中是一个特殊的数字,但在计算机世界中却不是。
【解决方案3】:

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

【讨论】:

  • 谢谢。我同意您为合理(不太大)m 指数构建查找表的建议。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      如果您可以长时间使用 log n 而不是 n,您可以节省时间,因为而不是

      n = pow(10*n,-m)
      

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

      l = -m*(l+1)
      

      【讨论】:

      • 亲爱的彼得,感谢您的关注。我不完全理解你对我的问题的解决方案。我想评估值 x = n * pow(10, -m)。因此,我们将非常感谢您提供进一步的建议!
      【解决方案7】:

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

      1. 如果您对 算法级别的优化你 可能会寻找并行化 接近。

      2. 您可以加快速度 使用 Ipp 的系统/架构级别 (对于英特尔处理器),或例如AMD AMD 核心数学库 (ACML)

      3. 利用图形的力量 卡可能是另一种方式(例如用于 NVIDEA 卡的 CUDA)

      4. 我觉得也值得一看 OpenCL

      【讨论】:

      • 亲爱的 Uhli, 感谢您的友好建议。正如您在此处所提到的,并行计算、Intel/LPP、CUDA 和 OPenCl 等前沿技术必将提高计算范围广泛的应用程序的性能。
      【解决方案8】:

      IEEE 754 指定了一堆浮点格式。那些被广泛使用的是二进制的,这意味着以 10 为底并没有任何特殊之处。这与您“10 也是一个特殊基数”的假设相反。

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

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

      【讨论】:

      • 你的十进制浮点数是 IBM 的东西;你会在他们的大型机上找到它。
      猜你喜欢
      • 2012-04-01
      • 2014-11-12
      • 2014-10-30
      • 1970-01-01
      • 2010-12-17
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多