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 ...
随机推荐
- JavaWeb基础(day14_css)
css css样式种类 内部样式 在head标签中使用 <style>标签 行内样式 直接在标签中写style属性进行赋值,style属性的就相当于内部样式的{} 外部样式 单独写一个文件 ...
- .NET Core微服务开发网关篇-ocelot
通过上篇我们知道,网关是外部访问的统一入口,本文采用Ocelot作为Api网关. 环境要求: vs2019 .NetCore3.1 Ocelot16.0.1 创建一个产品服务Api站点(AAStore ...
- 理解Spring(一):Spring 与 IoC
目录 什么是 Spring Spring 的整体架构 什么是 IoC Bean 的概念 Spring 的基本使用 Spring 的两种 IoC 容器 Spring 容器的基本工作原理 Spring B ...
- 集训作业 洛谷P1443 马的遍历
这个题是个搜索,而且有是最少的步数,肯定就是广搜啦,不知道为什么的同学先去学习一下广搜吧. 养成好习惯,看见最少步数就去想想广搜(只是我自己觉得) 竟然这个题可以如此顺畅的想到广搜,感觉不难啊,但还有 ...
- msf stagers开发不完全指北(四): msf 中使用域前置技术隐藏流量
msf 中使用域前置技术隐藏流量 前几篇都是说了下如何采用不同的语言开发 reverse_tcp 第二阶段,接下来将慢慢分析 reverse_http,这篇文章并不会围绕 stagers 进行讲解,这 ...
- SQL 给某字段添加汉字却显示??
错误展示: 解决方案: 1.在要修改的数据库上单击鼠标右键,并选择“属性”. 2.在弹出的数据库属性窗口中点击“选择页”中的“选项”. 3.将排序规则由默认的SQL_Latin1_Genera ...
- xilinx fpga 生成3*3窗口
在写滤波程序的时候在网上看了好几篇大佬的笔记,都有提到使用3*3窗口,由于小白一个,看到复杂的理论就惧怕的不行.但是现在不得不上,自己调用移位寄存器ip核然后做了个3*3窗口出来,自己动手作出来忽然感 ...
- django-rest-framework-源码解析004-三大验证(认证/权限/限流)
三大验证模块概述 在DRF的APIView重写的dispatch方法中, self.initial(request, *args, **kwargs) 这句话就是执行三大验证的逻辑, 点进去可以看到 ...
- Flutter + Android 混合开发
JIT (Just In Time) 即时编译器, 边执行边编译 程序运行时,JIT 编译器选择将最频繁执行的方法编译成本地代码.运行时才进行本地代码编译而不是在程序运行前进行编译 AOT可以理解为“ ...
- Flutter日常笔记
factory修饰的构造方法 表示不是每次返回的都是新创建出来的对象, 可以取内存中已有的, 比如单例模式的书写 每次返回的都是一个实例, 这时要使用factory修饰构造方法 flutter不要求显 ...