Java大数高精度,开根精确位数

1.第一种方法:二分法

BigDecimal eps=new BigDecimal(1e-125);
BigDecimal now=new BigDecimal(5);
BigDecimal get() {
	BigDecimal l=new BigDecimal("0");
	BigDecimal r=new BigDecimal("3");
	while(l.add(eps).compareTo(r)<=0) {
		BigDecimal mid=l.add(r).divide(BigDecimal.valueOf(2));
		if(mid.multiply(mid).compareTo(now)<=0) {
			l=mid;
		}
		else {
			r=mid;
		}
	}
	return l;
}

上面的代码可以精确125位,求根号5,求其他的类似。

第二种方法:牛顿迭代法

牛顿迭代法

主要就是一直求着个式子灵魂画师

//也是求根号5的   y=x^2-5;导数是2*x 
BigDecimal eps=new BigDecimal(1e-125);
BigDecimal now=new BigDecimal(5);
BigDecimal get() {  //牛顿迭代法 求解根号5
   BigDecimal res=null;
   for(int i=1;i<=120;i++) {
   	BigDecimal t=now.multiply(now).subtract(BigDecimal.valueOf(5));
   	res=now.subtract(t.divide   (now.multiply(BigDecimal.valueOf(2)),130,BigDecimal.ROUND_DOWN)    );
   	now=res;
   }
   return res;
}

还有一点值得注意
res=now.subtract(t.divide (now.multiply(BigDecimal.valueOf(2))));
     如果for循环中的第二行这么写,会报下面错误,这是因为高精浮点数精确位数的问题,可以像上面一样设置三个参数。第二个参数是精确位数,后面的是精确方式,当然越多越好,前提不爆内存。

Non-terminating decimal expansion; no exact representable decimal result.


2016大连icpc的大数搬威佐夫博弈,可以去尝试一下,题目就是要求出黄金分割比精确的一百多位。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值