在我编写的特定测试中,在double上使用模运算符比使用 this 函数慢。
final static double fastmod(double a, double b){
return a - b*(long)(a/b);
}
它是一个sin()函数测试,但我想讨论的是双重性能的模数。
编辑:删除了sin()测试链接 添加了仅测试模块。
直觉上我认为%运算符应该更快但测试结果更慢 我有什么东西在这里失踪吗?
答案 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
。