返回 Java编程练习目录
SICP中,说明了功能抽象的一种类型:一般化函数的设计。通用函数在通常的Java/C语言的教学中,通常放在后面作为高级内容。如在讲解C的函数指针、Java的模板方法模式的时候。
1.求平方根
牛顿的逐步逼近方法是通用的方法。例如,求一个数n的平方根,先给出一个猜测值x(如初始化为1或n),如果n- x* x不满足精度(设定精度参数),按照某个规则例如x =( x + n/ x)/2再猜测,直到满足精度。
package semantics.statement;
import static tips.Print.*;
/**
* 牛顿迭代逼近法
*
* @author (yqj2065)
* @version (2016.6)
*/
public class NewtonMethod{
static double epsilon = 1e-15;// relative error tolerance
public static double sqrt(double n) {
double x = 1.0;//x不能够为0,下面x作为分母;修改为while语句,则可以令 x = n;
do{
x = (x + n/x)/2.0;//
}while( Math.abs(x*x-n ) >epsilon);
return x;
}
public static void test(double x){
pln("sqrt("+x +")="+sqrt(x) );
}
}
满足精度的条件 Math.abs(x*x-n ) >epsilon,对于很小的数,精度不够因而不能计算出正确的答案;对于特别大的数,因为小数精度不足以表示两个大数之间的差,所以sqrt 会陷入死循环。这些我们现在不予理会。
求一个数n的平方根,即求f(x