牛顿迭代法对大数进行开平方操作(java版)

求f(x)=0的一实根,

可以采用牛顿迭代法,根据迭代公式

x(n+1)= x(n)-f(x(n))/f '(x(n))

注意后面是f(x)的导数

对大数a进行开平方操作呢,可以认为是求

x^2-a=0在x>0时候的一实根

java提供了现成的BigDecimal类,直接调用其api即可

上简单代码

import java.math.*;
public class Yaowei {
	public static void main(String[]args) throws Exception{
		final String a = "1234567896554987987465455642132132133213213213";
		BigDecimal a1 = new BigDecimal(a.substring((int)(a.length()/2)));
		int i = 0;
		final double flag = 0.001;
		while((i++) < 100)
		{
			BigDecimal temp = Yaowei.calc(a1);
			if (a1.subtract(temp).doubleValue() < flag)
			{
				a1 = temp;
				System.out.println(i);
				break;
			}
			a1 = temp;
		}
		System.out.println(a1);
	}
	private static BigDecimal calc(BigDecimal b){
		return b.subtract((b.multiply(b).subtract(new BigDecimal("1234567896554987987465455642132132133213213213"))).divide(new BigDecimal("2").multiply(b),3,BigDecimal.ROUND_HALF_EVEN));
	}

}


这个方法也可以判断某个大数是不是完全平方数,

迭代收敛后再验证一下即可

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Verilog是一种硬件描述语言,用于描述数字电路的行为和结构。牛顿迭代法是一种数值计算方法,用于求解方程的近似解。牛顿迭代法开平方是利用牛顿迭代法来计算一个数的平方根。 在Verilog中实现牛顿迭代法开平方,可以按照以下步骤进行: 1. 定义输入和输出信号:根据需要,定义一个输入信号表示待开平方的数,以及一个输出信号表示计算得到的平方根。 2. 初始化变量:定义一个变量作为初始猜测值,可以选择待开平方数的一半作为初始值。 3. 迭代计算:使用牛顿迭代法进行迭代计算,直到满足停止条件。迭代公式如下: ``` guess = (guess + number/guess) / 2; ``` 其中,guess表示当前的猜测值,number表示待开平方的数。 4. 判断停止条件:可以选择设置一个误差范围,当当前猜测值与上一次猜测值之间的差小于误差范围时,停止迭代。 5. 输出结果:将最终计算得到的平方根值赋给输出信号。 下面是一个简单的Verilog代码示例: ```verilog module NewtonSquareRoot( input wire [31:0] number, output wire [15:0] sqrt ); reg [15:0] guess; reg [15:0] next_guess; reg [15:0] error; initial begin guess = number >> 1; // 初始猜测值为待开平方数的一半 error = 16'hFFFF; // 设置一个初始误差范围 end always @(posedge clk) begin next_guess = (guess + (number / guess)) >> 1; // 迭代计算新的猜测值 error = guess - next_guess; // 计算当前猜测值与上一次猜测值之间的差 guess <= next_guess; // 更新猜测值 end assign sqrt = guess; // 将最终计算得到的平方根赋给输出信号 endmodule ``` 请注意,上述代码仅为示例,具体实现可能需要根据具体需求进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值