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