高精度开根

高精度开方,像python,haskell等语言原生支持高精度小数,做这个题不成问题,直接使用api即可。我习惯用java,研究BigDecimal发现里面没有开方的方法,所以需要手动实现。可以采用牛顿逼近法解决开方问题,可以用BigDecimal实现高精度。牛顿逼近法参见:http://baike.baidu.com/view/1514354.htm 

static int prec = 100;  
    static BigDecimal precE;  
    static {  
        String e = "-0.";  
        for (int i = 0; i < prec; i++) {  
            e += "0";  
        }  
        e += "1";  
        precE = new BigDecimal(e);  
    }  
  
    public static BigDecimal newtonMehtod(F f, DF df, double x00) {  
        BigDecimal x0 = BigDecimal.valueOf(x00);  
        BigDecimal x1 = x0.add(f.f(x0)  
                .divide(df.df(x0), BigDecimal.ROUND_HALF_EVEN).negate());  
        while (x1.add(x0.negate()).abs().add(precE).compareTo(BigDecimal.ZERO) > 0) {  
            x0 = x1;  
            x1 = x0.add(f.f(x0).divide(df.df(x0), BigDecimal.ROUND_HALF_EVEN)  
                    .negate());  
        }  
        return x1;  
    }  
  
public interface F {  
    BigDecimal f(BigDecimal x);  
}  
public interface DF {  
    BigDecimal df(BigDecimal x);  
}  

当prec取100时,算出来2的平方根是: 
1.4142135623730950488016887242096980785696718 
753769480731766797379907324784621070388503875 
343276415727350138462309122970249248360558507 
372126441214970999358314132226659275055927557 
999505011527820605714701095599716059702745345 
968620147285174186408891986095523. 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值