我读了下面的代码(在第5章,继承,霍斯特曼的核心的Java。):
double dx = (to - from) / (n-1);
for (double x = from; x <= to; x += dx)
{
double y = (Double) f.invoke(null, x);
System.out.printf(%10.4f | %10.4f%n" + y, x, y);
}
为什么你会在一个for循环使用双变量呢? 而这也正是invoke
用来做什么? 谢谢
编辑:f是一些相关领域
这是完全没有的事,特别是如果你想通过分数值环或增量的分数值。
不过我只是想添加一些其他的答案,这是,如果你使用这种技术, 不比较==
为结束循环的条件。 由于精度误差,这很容易导致即使是最好的意图的无限循环。 这就是为什么你的书的代码使用<=
它不使用浮点值,因为在算术和比较微妙的for循环的变量是个好主意。 你的循环可能不会通过您期望,因为舍入误差值迭代。 一个彻头彻尾情况的一个错误是可能的。
例如,这个循环
for (double x=0.0; x < 100.0; x += 0.1)
可以预料到通过0.0,0.1,0.2,...但由于舍入误差的经过略微不同的值的值。
例如,如果你想从1.5回路最多不超过8中的0.11增量,您将需要循环的双变量。
我们没有理由不这样做。 通常你整数循环,但没有理由你不能做同样的事情与双打应用任意指令像X = X * 1.2或类似的东西循环迭代结束。 此外,我们需要知道什么f
是告诉你什么呢调用;)
这是一个非常糟糕的主意 。 对于大型n
(相对于to - from
), dx
将是如此之小, x += dx
不会改变的值x
,让你有一个循环条件,将永远是真实的,你会被卡在环。
不要使用不准确的数据(如float
和double
)来控制程序的流程。
相反,你应该使用一个整数(例如从0
包容n
独家)来控制循环。 有几个方法可以做到这一点(其中大部分是错误的,当涉及到处理舍入误差),但至少可以肯定的是你的循环将终止。
关于你提到的有关问题, invoke
:我觉得f
是一个Method
,而不是一个Field
。 java.lang.reflect
是一组类为反射 。 使用反射,程序员使它使得f
点的方法,以及invoke
可以用来调用该方法。 由于它被调用与null
的第一个参数(这通常会规定什么this
是), f
必须是指一些静态方法,才能取得成功。