您的位置:首页 > 其它

牛顿迭代法求高精度开方

2015-05-18 21:20 232 查看
牛顿迭代法:http://baike.baidu.com/view/643093.htm

牛顿迭代公式:x(n+1)=x(n)-f(x(n))/f'(x(n))

如求2的平方根,构造函数 x^2 - 2 = 0;

dif为精度, 如果精度小于dif 跳出程序。这样可求出简单的平方根

[java] view
plaincopy

import java.math.BigDecimal;  

import java.math.MathContext;  

import java.math.RoundingMode;  

  

public class sqrt{  

    public static void main(String[] args){  

        //                  x^2 -2 = 0  

        BigDecimal x1 = new BigDecimal(1);  

        BigDecimal x2 = new BigDecimal(0);  

        BigDecimal dif = new BigDecimal(0);  

        BigDecimal precision = new BigDecimal(0.000000000000000000000000000000000000000000000000001);  

        while(true){  

            x2 = x1.subtract(x1.pow(2).subtract(new BigDecimal(2)).divide(x1.multiply(new BigDecimal(2)),100, BigDecimal.ROUND_HALF_EVEN));  

              

            if(x1.compareTo(x2)==1){  

                dif = x1.subtract(x2);  

            }else{  

                dif = x2.subtract(x1);  

            }  

              

            if(dif.compareTo(precision)==-1){  

                System.out.println(x1+","+x2);  

                break;  

            }  

              

            x1 = x2;  

        }  

    }  

}  

如果要求高精度,而 怎样确定dif小于小数点后100位?

使用java提供的大数类,后程序变为

[java] view
plaincopy

public class sqrt{  

    public static void main(String[] args){  

        //                  x^2 -2 = 0  

        double x1=1,x2=0;  

        double dif=0;  

        while(true){  

            x2 = x1 - (x1*x1-2)/(2*x1);  

            if(x2>x1){  

                dif = x2-x1;  

            }else{  

                dif = x1-x2;  

            }  

              

            if(dif<0.000000000001){  

                System.out.println(x1+","+x2);  

                break;  

            }  

            x1 = x2;  

        }  

    }  

}  

其中大数运算中出现除不尽的异常,后直接控制了位数,保留100位。

现在的问题是,如何确定精度dif是100,也就是怎样用Java表示出0.000……1 (小数点后100位)

考虑了很久,其实可以用  大数运算  用1除10的100次方。

改进代码如下:

[java] view
plaincopy

import java.math.BigDecimal;  

import java.math.MathContext;  

import java.math.RoundingMode;  

  

public class sqrt{  

    public static void main(String[] args){  

        //                  x^2 -2 = 0  

        BigDecimal x1 = new BigDecimal(1);  

        BigDecimal x2 = new BigDecimal(0);  

        BigDecimal dif = new BigDecimal(0);  

          

        BigDecimal precision =x1.divide(new BigDecimal(10).pow(100));  

        System.out.println(precision);  

        while(true){  

            x2 = x1.subtract(x1.pow(2).subtract(new BigDecimal(2)).divide(x1.multiply(new BigDecimal(2)),100, BigDecimal.ROUND_HALF_EVEN));  

              

            if(x1.compareTo(x2)==1){  

                dif = x1.subtract(x2);  

            }else{  

                dif = x2.subtract(x1);  

            }  

              

            if(dif.compareTo(precision)==-1){  

                System.out.println(x1+","+x2);  

                break;  

            }  

              

            x1 = x2;  

        }  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: