java - 对 double 使用模时性能会下降

标签 java performance double modulo

在我编写的特定测试中,对 double 使用模运算符比使用 this 函数慢。

final static double fastmod(double a, double b){
return a - b*(long)(a/b);
}

这是一个 sin() 函数测试,但我想讨论的是双倍性能的模。

编辑:删除了 sin() 测试链接。
添加了仅测试模数的测试。

https://ideone.com/6zqxBR

直觉上我认为 % 运算符应该更快,但测试表明它更慢。
我在这里缺少什么吗?

最佳答案

您的fastmod确实更快,但不等于 % .

使用 Math.random()*100 产生的参数您的实现给出了一个很好的近似值,但是,结果不一定等于 % 的结果转换为 long 时由于精度损失而导致的操作,例如

    System.out.println(7.4 % 2.1);          // 1.1
    System.out.println(fastmod(7.4, 2.1));  // 1.0999999999999996

还有fastmod不能正确处理大值和各种极端情况:

    System.out.println(1E20 % 2);          // 0.0
    System.out.println(fastmod(1E20, 2));  // 8.155325592629045E19

    System.out.println(1 % Double.MIN_VALUE);          // 0.0
    System.out.println(fastmod(1, Double.MIN_VALUE));  // 1.0

事实上,您的实现得到了简化,这使得它比“正确”余数更快。如果您不关心long之外的数字范围,如果您意识到大约第 15 位数字可能会出现错误,那么使用更快的 fastmod 是完全可以的。 .

关于java - 对 double 使用模时性能会下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46375144/

相关文章:

java - 当使用 Google guice ServletModule 在代码中加载 servlet 时,如何在 Jetty 9.3 中使 _asyncSupported = true

CSS 动画 (@keyframes) 正在加热 CPU

javascript - 调试错误消息:“此页面上的脚本导致Internet Explorer运行缓慢”

Java:理解 double (和规范化)

c++ - 在 libc++ 和 glibc 中解析 double 时不一致的字符串流行为

java - 有一个实例变量作为最终点?

Java 邮件 TLS 身份验证

java - 八皇后拼图逻辑错误

javascript - JQuery 切换方法在 1000+ UL 上运行缓慢

c - 为什么将 1.0/3.0 添加 3 次就像数学上预期的那样?