2020-07-28:已知sqrt (2)约等于 1.414,要求不用数学库,求sqrt (2)精确到小数点后 10 位。
福哥答案2020-07-28:
1.二分法。
2.手算法。
3.牛顿迭代法。基础是泰勒级数展开法。
4.泰勒级数法。
5.平方根倒数速算法,卡马克反转。基础是牛顿迭代法。
golang代码如下:
package test28_sqrt import (
"fmt"
"math"
"strconv"
"testing"
) const (
EPSINON = 0.0000000001
) //go test -v -test.run TestSqrt
func TestSqrt(t *testing.T) {
f := 2.0
fmt.Printf("%v 系统自带\r\n", strconv.FormatFloat(math.Sqrt(f), 'f', -1, 64))
fmt.Println("--------------------------------------------")
fmt.Printf("%v 二分法结果\r\n", strconv.FormatFloat(sqrtDichotomy(f), 'f', -1, 64))
fmt.Printf("%v 手算法\r\n", strconv.FormatFloat(sqrtHand(f), 'f', -1, 64))
fmt.Printf("%v 牛顿迭代法结果\r\n", strconv.FormatFloat(sqrtNewton(f), 'f', -1, 64))
fmt.Printf("%v 泰勒级数法结果\r\n", strconv.FormatFloat(sqrtTaylor(f), 'f', -1, 64))
fmt.Printf("%v 64位平方根倒数速算法结果1,精度上不符合\r\n", strconv.FormatFloat(sqrtRootFloat64(f), 'f', -1, 64))
fmt.Printf("%v 64位平方根倒数速算法结果2,精度上不符合\r\n", strconv.FormatFloat(float64(InvSqrt64(f)), 'f', -1, 64))
fmt.Println("--------------------------------------------")
f2 := float32(f)
fmt.Printf("%v 32位平方根倒数速算法结果1,精度上不符合\r\n", strconv.FormatFloat(float64(sqrtRootFloat32(f2)), 'f', -1, 64))
fmt.Printf("%v 32位平方根倒数速算法结果2,精度上不符合\r\n", strconv.FormatFloat(float64(InvSqrt32(f2)), 'f', -1, 64))
} //二分法
func sqrtDichotomy(f float64) float64 {
left := 0.0
right := f
if f < 1 {
right = 1
} mid := f / 2 //不写0.0的原因是for循环可能进不了,0值明显不对
mid_mid := 0.0 //mid*mid的值
for right-left > EPSINON {
mid = (left + right) / 2.0
mid_mid = mid * mid
if mid_mid > f {
right = mid
} else if mid_mid < f {
left = mid
} else {
return mid
}
} return mid
} //牛顿迭代法.基础是泰勒级数展开法
func sqrtNewton(f float64) float64 {
z := 1.0
for math.Abs(z*z-f) > EPSINON {
z = (z + f/z) / 2
}
return z
} //手算法
func sqrtHand(f float64) float64 {
i := int64(f)
ret := 0.0 //返回值
rettemp := 0.0 //大的返回值
retsinge := 0.5 //单个值 //获取左边第一个1,retsingle就是左边的第一个1的值
for i > 0 {
i >>= 2
retsinge *= 2
} rettemp_rettemp := 0.0
for {
rettemp = ret + retsinge
rettemp_rettemp = rettemp * rettemp
if math.Abs(rettemp_rettemp-f) > EPSINON {
if rettemp_rettemp > f { } else {
ret = rettemp
}
retsinge /= 2
} else {
return rettemp
}
}
} //泰勒级数展开法
func sqrtTaylor(f float64) float64 {
correction := 1.0
for f >= 2.0 {
f /= 4
correction *= 2
}
return taylortemp(f) * correction
}
func taylortemp(x float64) float64 { //计算[0,2)范围内数的平方根
var sum, coffe, factorial, xpower, term float64
var i int
sum = 0
coffe = 1
factorial = 1
xpower = 1
term = 1
i = 0
for math.Abs(term) > EPSINON {
sum += term
coffe *= 0.5 - float64(i)
factorial *= float64(i) + 1
xpower *= x - 1
term = coffe * xpower / factorial
i++
}
return sum
} //32位平方根倒数速算法1.卡马克反转。基础是牛顿迭代法。
func sqrtRootFloat32(number float32) float32 {
var i uint32
var x, y float32
f := float32(1.5)
x = float32(number * 0.5)
y = number
i = math.Float32bits(y) //内存不变,浮点型转换成整型
i = 0x5f3759df - (i >> 1) //0x5f3759df,注意这一行,另一个数字是0x5f375a86
y = math.Float32frombits(i) //内存不变,浮点型转换成整型
y = y * (f - (x * y * y))
y = y * (f - (x * y * y))
return number * y
} //32位平方根倒数速算法2
func InvSqrt32(x1 float32) float32 {
x := x1
xhalf := float32(0.5) * x
i := math.Float32bits(xhalf) // get bits for floating VALUE
i = 0x5f375a86 - (i >> 1) // gives initial guess y0
x = math.Float32frombits(i) // convert bits BACK to float
x = x * (float32(1.5) - xhalf*x*x) // Newton step, repeating increases accuracy
x = x * (float32(1.5) - xhalf*x*x) // Newton step, repeating increases accuracy
x = x * (float32(1.5) - xhalf*x*x) // Newton step, repeating increases accuracy
return 1 / x
} //64位平方根倒数速算法1.卡马克反转。基础是牛顿迭代法。
func sqrtRootFloat64(number float64) float64 {
var i uint64
var x, y float64
f := 1.5
x = number * 0.5
y = number
i = math.Float64bits(y) //内存不变,浮点型转换成整型
i = 0x5fe6ec85e7de30da - (i >> 1) //0x5f3759df,注意这一行,另一个数字是0x5f375a86
y = math.Float64frombits(i) //内存不变,浮点型转换成整型
y = y * (f - (x * y * y))
y = y * (f - (x * y * y))
return number * y
} //64位平方根倒数速算法2
func InvSqrt64(x1 float64) float64 {
x := x1
xhalf := 0.5 * x
i := math.Float64bits(xhalf) // get bits for floating VALUE
i = 0x5fe6ec85e7de30da - (i >> 1) // gives initial guess y0
x = math.Float64frombits(i) // convert bits BACK to float
x = x * (1.5 - xhalf*x*x) // Newton step, repeating increases accuracy
x = x * (1.5 - xhalf*x*x) // Newton step, repeating increases accuracy
x = x * (1.5 - xhalf*x*x) // Newton step, repeating increases accuracy
return 1 / x
}
敲命令 go test -v -test.run TestSqrt后,结果如下:

2020-07-28:已知sqrt (2)约等于 1.414,要求不用数学库,求sqrt (2)精确到小数点后 10 位。的更多相关文章
- 已知 sqrt (2)约等于 1.414,要求不用数学库,求 sqrt (2)精确到小数点后 10 位
问题:已知 sqrt (2)约等于 1.414,要求不用数学库,求 sqrt (2)精确到小数点后 10 位. 出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家. 考察点:基础算法的灵活应 ...
- 【云栖社区002-二分估值法】要求不用数学库,求 sqrt (2)精确到小数点后10位(Java版)
如题 初步审题的时候,想到的是暴力搜索:初步设置一个合法的种子,依次按照1e-2,1e-3,1e-4,1e-5,1e-6 , 1e-7...暴力搜索,额,就是太麻烦了. 打比赛搜索写多了,一看见题目就 ...
- 班上有学生若干名,已知每名学生的成绩(整数),求班上所有学生的平均成绩,保留到小数点后两位。同时输出该平均成绩整数部分四舍五入后的数值。 第一行有一个整数n(1<= n <= 100),表示学生的人数。其后n行每行有1个整数,表示每个学生的成绩,取值在int范围内。
#include<iostream> #include<iomanip> using namespace std ; int main() { int n; while(cin ...
- 2020牛客暑期多校训练营 第二场 B Boundary 计算几何 圆 已知三点求圆心
LINK:Boundary 计算几何确实是弱项 因为好多东西都不太会求 没有到很精通的地步. 做法很多,先说官方题解 其实就是枚举一个点 P 然后可以发现 再枚举一个点 然后再判断有多少个点在圆上显然 ...
- C# 序列化过程中的已知类型(Known Type)
WCF下的序列化与反序列化解决的是数据在两种状态之间的相互转化:托管类型对象和XML.由于类型定义了对象的数据结构,所以无论对于序列化还是反序列化,都必须事先确定对象的类型.如果被序列化对象或者被反序 ...
- WCF技术剖析之十三:序列化过程中的已知类型(Known Type)
原文:WCF技术剖析之十三:序列化过程中的已知类型(Known Type) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话) ...
- 实战分享:如何成功防护1.2T国内已知最大流量DDoS攻击
作者:腾讯云宙斯盾安全团队&腾讯安全平台部 引言: DDoS攻击势头愈演愈烈,除了攻击手法的多样化发展之外,最直接的还是攻击流量的成倍增长.3月份国内的最大规模DDoS攻击纪录还停留在数百G规 ...
- WP8.1开发者预览版本号已知 Bug
偶的 Lumia 920 已经升级到最新的 8.1 开发者预览版本号,使用中没有发现什么问题. 可能是由于偶玩手机的情况比較少吧!忽然看到 MS 停止此版本号的更新,并说明有非常多的 BUG,偶就郁闷 ...
- 已知两点的经度和纬度,计算两点间的距离(php,javascript)
php代码:转载 http://www.cnblogs.com/caichenghui/p/5977431.html /** * 求两个已知经纬度之间的距离,单位为米 * * @param lng1 ...
随机推荐
- bzoj2456mode
bzoj2456mode 题意: 给你一个n个数的数列,求出现次数超过n div 2的数(只有1个). 题解: 注意空间只有1M,显然不能开数组.用两个变量,一个存“当前数”,另一个存“当前数”的个数 ...
- 食用Win系统自带的PowerShell登录服务器
运行powershell输入ssh root@你的服务器ip -p你的端口 切换rm ~/.ssh/known_hosts cmd 运行 ping 你的ip -t一直ping ctrl+c停止 tra ...
- JavaScript经典实例(浏览器事件)
跨浏览器事件 1.跨浏览器添加事件 function addEvent(obj,type,fn){ if(obj.addEventListener){ obj.addEventListener(typ ...
- 自已动手作图搞清楚AVL树
@ 目录 一.背景 二.平衡二分搜索树---AVL树 2.1 AVL树的基本概念 结点 高度 平衡因子 2.2 AVL树的验证 三.旋转操作 3.1 L L--需要通过右旋操作 3.2 R R--需要 ...
- DJANGO-天天生鲜项目从0到1-010-购物车-购物车操作页面(勾选+删改)
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- css盒子流动和block。inline
回忆一下盒子流动等概念! 1.盒子模型的宽度与高度,都是包括padding的值.(代码的理解如下:) 这样的结果的到就是 宽度和高度都是220了 2.流动型,在标签中存在块级元素和行内元素, 块级元 ...
- spring学习(四)使用注解代替xml配置
用的是IDEA的maven工程,pom.xml文件导包依赖省略 一.书写要导入容器的实体类 import org.springframework.beans.factory.annotation.Va ...
- Go语言的跳跃表(SkipList)实现
之所以会有这篇文章,是因为我在学习Go语言跳表代码实现的过程中,产生过一些困惑,但网上的大家都不喜欢写注释- - 我的代码注释一向是写的很全的,所以发出来供后来者学习参考. 本文假设你已经理解了跳表的 ...
- 注册中心Eureka、Zookeeper、Consul的异同点
先上结论: 基于CAP理论介绍: C:Consistency (强一致性)A:Available (可用性)P:Partition tolerance (分区容错性) 最多只能同时较好的满足两个 CA ...
- Django学习路22_empty为空,forloop.counter 从1计数,.counter0 从0计数 .revcounter最后末尾数字是1,.revcounter0 倒序,末尾为 0
当查找的数据不存在,返回为 空时 在 html 中使用 {%empty%} 语句 进行显示 def getstudents(request): students = Student.objects.a ...