升级到Java 1.8.0_20后,我们的测试系统报告错误,但代码没有更改.我发现,Math.pow()使用完全相同的输入参数调用会在重新调用的调用时产生不同的结果.在Java 1.8.0_11中,它的行为与预期的一样,并且总是返回相同的值,但是对于Java 1.8.0_20及更高版本,它有时会返回稍微不同的值.
这类似于Math.pow根据java版本产生不同结果的问题,但不同,因为pow()的结果在一个VM中不同.
在Java 1.8.0_20及更高版本下运行时,以下JUint测试失败
import static org.junit.Assert.assertEquals;
import java.util.function.BiFunction;
import org.junit.BeforeClass;
import org.junit.Test;
public class PowerTest {
private static final int N = 1000000;
private static final double base = 5350.456329377186;
private static final double exp = 2.0;
private static double eval(final BiFunction<Double, Double, Double> f) {
return f.apply(base, exp);
}
private void loop(final BiFunction<Double, Double, Double> f) {
final double x = eval(f);
for (int i = 0; i < N; i++) …Run Code Online (Sandbox Code Playgroud)