【问题标题】:Java - Faster alternative to Math.pow() and Math.sqrt() [closed]Java - Math.pow() 和 Math.sqrt() 的更快替代方案 [关闭]
【发布时间】:2013-02-27 00:15:45
【问题描述】:

我的程序使用Math.pow() 计算一个相对较大的双数的 2 次方。稍后我需要找到一个非常大的双数的平方根。问题是,我必须这样做超过 100,000 次,而且需要很长时间。有没有其他方法可以加快这个过程?谢谢

编辑:我所说的大数是指 1000 到 10000 之间(所以在计算方面可能没有那么大)。而就耗时而言,完成 500 次功能大约需要 30 秒

【问题讨论】:

  • 你能定义“相对大”、“非常大”和“真的很长”吗?
  • 我认为对您的问题进行更全面的描述将使我们能够更好地为您提供帮助。
  • 从您的编辑中,您能准确地告诉我们“功能”是什么吗?也许包括一些代码。
  • 提供代码。您引用的数字似乎极不可能花费这么长时间。没有实际代码,我们无法弄清楚实际发生了什么。
  • 我可以在 210 毫秒内对随机数进行一百万次 pow() 和 sqrt() 操作。我建议读取文件并将文本转换为二进制文件会占用大量时间。

标签: java function math floating-accuracy pow


【解决方案1】:

您不太可能找到比 Java Math 更好(更快)的实现。尝试改变算法中的计算方式可能会更幸运。例如,有什么方法可以避免求大数的平方根?

如果这不起作用,您可以尝试用一种更合适的语言来实现它,这种语言用于快速数学计算(比如 Matlab)。

否则,您可以尝试在其他方面进行优化。如果以后有用的话,也许你可以尝试缓存过去的结果。

【讨论】:

  • 嗯,它涉及欧几里得距离公式,所以我不能避免它
  • @Matt9Atkins 你真的需要欧几里得距离吗?您可以使用它的正方形进行比较...
  • 嗯,还有一些选项可以加快速度。您需要实际距离,还是只是比较它们?如果你只是比较它们,你可以避免平方根部分。
  • @Oleksi 我猜另一个答案表明Math.pow(x, 2)的速度提高
  • 如果您需要比较它们,那么如果您将距离保留为非平方根形式,则会得到相同的结果!请注意,如果 x
【解决方案2】:

“2 的幂”是平方。你最好把这个数字乘以它自己。

sqrt 的库版本可能比您在其他地方挖掘的任何东西都快。如果你调用一个 C 例程,你只会增加跨语言调用的开销。但是您是否需要精确的平方根,或者近似值的表格查找需要吗?这些值是否重复很多,即您是否经常需要计算相同数字的根?如果是这样,将平方根缓存在 HashMap 中可能比计算它们更快。

【讨论】:

    【解决方案3】:

    嗯,你的问题与 2 的幂可以简单地通过将数字乘以自身来解决。 例如,假设变量 a 是您想要提高到 2 的数字。它与以下内容相同: int a=5; int b=a*a;

    【讨论】:

      【解决方案4】:

      我唯一能想到的是将结果存储起来以提高速度,平方根不会改变,大约 9000 个存储的数字并不多。您可能会很好地构建您的数据,这样您就可以确保您可以优化搜索适当的结果。

      【讨论】:

        【解决方案5】:

        您可以使用 x*x 代替 pow(x, 2)。

        对于平方根,你应该先看看 sqrt 的实现(近似法)。

        也许您可以找到更好的,例如Newton's method(在方程 sqrt(N)-x=0 上)。

        这也取决于所需的准确性,您可以用准确性与时间进行交易。

        您还可以存储结果以避免对同一条目进行多次计算。

        【讨论】:

        • 当然你的意思是你可以使用x*x而不是pow(x,2)。是的,将其计算为 x*x 肯定更好。
        猜你喜欢
        • 2017-05-15
        • 1970-01-01
        • 2023-03-24
        • 2014-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-11
        • 2012-07-05
        相关资源
        最近更新 更多