Java不使用Math.sqrt方法实现的求平方根
发布日期:2021-06-29 12:23:45
浏览次数:2
分类:技术文章
本文共 1490 字,大约阅读时间需要 4 分钟。
今天中午吃饭闲暇,和朋友聊到了如果不使用Math.sqrt方法,该怎么通过Java实现同样的功能,我们各自发表了下意见。
以下是我和朋友二人的解法思路:
1、朋友采用的是先确定当前数所处的最小整数区间,然后再通过二分法来进行判断检测。
2、我当时的想法是直接通过二分法进行判断检测,然后判断精度是否到达1e-7进行处理;
随后,回到宿舍后,想到了通过牛顿迭代法进行求值,而且速度上更快了一些。然后,索性就通过三种方式实现了该方法,
代码如下:
方法一(二分法):
public static double sqrt(double t, Double precise) { double low = 0, high = t, middle, squre, prec = precise != null ? precise : 1e-7; if ( t < 0 ) { throw new RuntimeException("Negetive number cannot have a sqrt root."); } while ( high - low > prec ) { middle = ( low + high ) / 2; squre = middle * middle; if ( squre > t ) { high = middle; } else { low = middle; } } return ( low + high ) / 2; }解法二(牛顿迭代法):
public static double sqrt_ ( double t, Double precise) { double x0 = t, x1, differ, prec = precise != null ? precise : 1e-7; while ( true ) { x1 = ( x0 * x0 + t ) / ( 2 * x0 ); differ = x1 * x1 - t; if ( differ <= prec && differ >= -prec ) { return x1; } x0 = x1; } }解法三(也是最准确的,针对朋友解法的优化):
public static float sqrtRoot(float m) { if ( m == 0 ) { return 0; } float i = 0; float x1, x2 = 0; while ( ( i * i ) <= m ) { i += 0.1; } x1 = i; for ( int j = 0; j < 10; j++) { x2 = m; x2 /= x1; x2 += x1; x2 /= 2; x1 = x2; } return x2; }
该解法的测试代码:
public static void main(String[] args) { for ( int i = 0; i <= 10; i++ ) { System.out.println(i + " : " + sqrtRoot(i)); } }
一下附上该解法的测试结果图:
以上便是Java不使用Math.sqrt方法实现的求平方根解法。
转载地址:https://buildupchao.blog.csdn.net/article/details/53762265 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月30日 15时01分18秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【超级干货+福利】AIDD最全面的学习教程
2019-04-29
最新通知:AIDD与网络药理学资料大全
2019-04-29
Lammps分子动力学与第一性原理材料模拟及催化
2019-04-29
实习生小白的日常
2019-04-29
实习小白的日常(4)
2019-04-29
APP调用服务器API设计
2019-04-29
zbar优化
2019-04-29
微信扫码登录验证PHP代码(不用开放平台)
2019-04-29
CH554E USB单片机 10引脚小封装低成本USB方案
2019-04-29
windows MQTT客户端
2019-04-29
LINUX下挂载(mount)查看树莓派镜像文件
2019-04-29
基于CH568芯片加密SD卡方案
2019-04-29
1元钱的超低成本单芯片USB单片机方案
2019-04-29
单片机/树莓派扩展双串口(TTL和RS485)
2019-04-29
JAVA(android)提取WIFI客流探针MAC地址源码
2019-04-29
基于CH568芯片的SATA电子盘方案
2019-04-29
linux下C语言判断网络是否连接
2019-04-29
STM32Cube_FW_F4_V1.17 F4固件包百度网盘下载
2019-04-29
猿来绘Java-35-线程的同步(生产者和消费者问题)
2019-04-29