我有要分析的代码。这是二等分法。
哪些输入将导致进入第18和19行的分支?
public class BiSectionExample {
public double root(double d, double e, double f) throws IllegalArgumentException {
double middle;
if (d >= e) {
System.out.println("1");
throw new IllegalArgumentException("low must be lower than high");
}
System.out.println(d + " " + e + " " + f);
while (e - d > f) {
System.out.println("2");
System.out.println("once");
middle = (e + d) / 2;
if (middle < e) {
System.out.println("3");
d = middle;
} else {
System.out.println("4"); // line 18
e = middle; // line 19
}
}
System.out.println((e + d) / 2);
return (e + d) / 2;
}
}
解决方案如下:
如果使用JUnit进行测试,则可以使用重复测试并输入随机生成的值,因此达到这些行的可能性很高。在行上设置调试器断点也很有用,这样您可以看到到达行时的输入内容。
但是,我认为通过手动进行测试是不可能的,因为:
middle
是e
和d
之间的中间
要使middle
大于e
(在其他情况下)d
必须大于e
由于第一个if子句(在这种情况下会引发异常),因此似乎不允许这种情况
如果e
和d
是相同的值(因此middle
等于e
而不是更小),这是可能的,但是由于双精度,这也可能失败。