在double上使用modulo时性能下降

时间:2017-09-23 01:30:03

标签: 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

直觉上我认为%运算符应该更快但测试结果更慢 我有什么东西在这里失踪吗?

1 个答案:

答案 0 :(得分:1)

您的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