【ICPC模板】高精度平方根

牛顿迭代法实现

公式:

核心:求与横坐标交点

求导:

牛顿迭代公式:

特别地:

上述公式求解num的平方根。

Java代码:

public static BigDecimal sqrt(BigDecimal b, BigDecimal eps) {
        BigDecimal crt = new BigDecimal(b.toString());
        BigDecimal two = BigDecimal.valueOf(2);
        int scale = eps.scale() + 2;
        Boolean isNegtive = false;
        if (crt.compareTo(BigDecimal.valueOf(0)) < 0) {
            b = b.negate();
            crt = crt.negate();
            isNegtive = true;
        }
        while (true) {
            BigDecimal nxt = crt.subtract(crt.multiply(crt).subtract(b).divide(two.multiply(crt), scale, BigDecimal.ROUND_DOWN));
            // test
            // System.out.println(nxt);
            if (nxt.subtract(crt).abs().compareTo(eps) <= 0) {
                crt = nxt;
                break;
            }
            crt = nxt;
        }
        if (isNegtive) {
            b = b.negate();
            crt = crt.negate();
        }
        return crt;
    }
    public static BigDecimal sqrt(BigDecimal b) {
        BigDecimal eps = new BigDecimal("0.000000000000000000000000000000000001");
        return sqrt(b, eps);
    }
    public static BigDecimal sqrt(BigInteger b, BigDecimal eps) {
        BigDecimal tmp = new BigDecimal(b.toString());
        return sqrt(tmp, eps);
    }
    public static BigDecimal sqrt(BigInteger b) {
        BigDecimal tmp = new BigDecimal(b.toString());
        return sqrt(tmp);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值