Java 提高双打除法运算的成绩

Java 提高双打除法运算的成绩,java,performance,double,division,cosine-similarity,Java,Performance,Double,Division,Cosine Similarity,在我的一个Java项目中,我使用double值来执行余弦相似性计算 这是公式: 余弦=(v1×v2)/(|v1 |×| v2 |) 所以,在我的例子中,分子和分母(向量简化后)都是双精度的。在分析我的代码以寻找优化或耗时的地方之后,我发现除法操作(对于双值)需要更多的时间来执行 我尝试寻找两个数的不同除法(使用位运算符[因为位运算符更快]) 我遇到了这个链接,但它是整数或长的唯一 所以,我的问题是 如何使用其他方法提高除法运算(双打)的性能 如果编译器在执行算术运算时将双精度值转换为二进制数,那

在我的一个Java项目中,我使用
double
值来执行余弦相似性计算

这是公式:

余弦=(v1×v2)/(|v1 |×| v2 |)

所以,在我的例子中,分子和分母(向量简化后)都是双精度的。在分析我的代码以寻找优化或耗时的地方之后,我发现除法操作(对于双值)需要更多的时间来执行

我尝试寻找两个数的不同除法(使用位运算符[因为位运算符更快])

我遇到了这个链接,但它是整数或长的唯一

所以,我的问题是

  • 如何使用其他方法提高除法运算(双打)的性能

  • 如果编译器在执行算术运算时将双精度值转换为二进制数,那么双精度值或浮点值如何除法?我需要一些机器层面的解释


  • double和float值除法是由浮点协处理器(在某些情况下是GPU)执行的

    浮点除法是一种昂贵的操作,我不相信Java中有“加速”浮点除法的方法。我认为,为了提高程序的性能,您应该尝试应用编程优化技术,如使用公共子表达式:

    double x = d * (lim / max) * sx;
    double y = d * (lim / max) * sy; 
    

    和数学优化(如寻找更快的公式进行等效计算)

    也许java中有一些“更快”的正弦和余弦实现(由最终用户作为库开发),您可以查看这些实现(或者使用Mat.sin和Math.cos标准方法)

    检查快速正弦和余弦上的堆栈溢出回答:

    检查这篇文章:

    希望这能有所帮助

    这些问题主要是为了教育目的,或者是针对硬件分割指令不可用的架构。它肯定比硬件支持慢很多。在软件中模拟浮点除法会更糟糕,除非您不需要全精度,在这种情况下,您可以将a/b更改为a*(1.0/b)。看见
    double depth = d * (lim / max);
    double x = depth * sx;
    double y = depth * sy;