福哥答案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 位。的更多相关文章

  1. 已知 sqrt (2)约等于 1.414,要求不用数学库,求 sqrt (2)精确到小数点后 10 位

    问题:已知 sqrt (2)约等于 1.414,要求不用数学库,求 sqrt (2)精确到小数点后 10 位. 出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家. 考察点:基础算法的灵活应 ...

  2. 【云栖社区002-二分估值法】要求不用数学库,求 sqrt (2)精确到小数点后10位(Java版)

    如题 初步审题的时候,想到的是暴力搜索:初步设置一个合法的种子,依次按照1e-2,1e-3,1e-4,1e-5,1e-6 , 1e-7...暴力搜索,额,就是太麻烦了. 打比赛搜索写多了,一看见题目就 ...

  3. 班上有学生若干名,已知每名学生的成绩(整数),求班上所有学生的平均成绩,保留到小数点后两位。同时输出该平均成绩整数部分四舍五入后的数值。 第一行有一个整数n(1<= n <= 100),表示学生的人数。其后n行每行有1个整数,表示每个学生的成绩,取值在int范围内。

    #include<iostream> #include<iomanip> using namespace std ; int main() { int n; while(cin ...

  4. 2020牛客暑期多校训练营 第二场 B Boundary 计算几何 圆 已知三点求圆心

    LINK:Boundary 计算几何确实是弱项 因为好多东西都不太会求 没有到很精通的地步. 做法很多,先说官方题解 其实就是枚举一个点 P 然后可以发现 再枚举一个点 然后再判断有多少个点在圆上显然 ...

  5. C# 序列化过程中的已知类型(Known Type)

    WCF下的序列化与反序列化解决的是数据在两种状态之间的相互转化:托管类型对象和XML.由于类型定义了对象的数据结构,所以无论对于序列化还是反序列化,都必须事先确定对象的类型.如果被序列化对象或者被反序 ...

  6. WCF技术剖析之十三:序列化过程中的已知类型(Known Type)

    原文:WCF技术剖析之十三:序列化过程中的已知类型(Known Type) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话) ...

  7. 实战分享:如何成功防护1.2T国内已知最大流量DDoS攻击

    作者:腾讯云宙斯盾安全团队&腾讯安全平台部 引言: DDoS攻击势头愈演愈烈,除了攻击手法的多样化发展之外,最直接的还是攻击流量的成倍增长.3月份国内的最大规模DDoS攻击纪录还停留在数百G规 ...

  8. WP8.1开发者预览版本号已知 Bug

    偶的 Lumia 920 已经升级到最新的 8.1 开发者预览版本号,使用中没有发现什么问题. 可能是由于偶玩手机的情况比較少吧!忽然看到 MS 停止此版本号的更新,并说明有非常多的 BUG,偶就郁闷 ...

  9. 已知两点的经度和纬度,计算两点间的距离(php,javascript)

    php代码:转载 http://www.cnblogs.com/caichenghui/p/5977431.html /** * 求两个已知经纬度之间的距离,单位为米 * * @param lng1 ...

随机推荐

  1. OSCP Learning Notes - Netcat

    Introduction to Netcat Connecting va Listening Bind Shells Attacker connects to victim on listening ...

  2. P3379 最近公共祖先(LCA) 洛谷

    题意简单明了(这就是个模板). 就是让我们找2个节点的公共祖先而已,但我们要讲的做法不是生硬的爆搜,而且直接搜好像过不去…… 这次就讲我往后拖了n多天才开始学了倍增LCA. 嗯,这个题,如果2个节点的 ...

  3. ant design pro/前端/JS:实现本地运行https

    工具:github---mkcert 用于生成本地证书 ant p版本:1.0.0 这里我只说如何给antp部署https,以及会遇到的问题解决,其他请看原文参考 1.用mkcert生成证书,去git ...

  4. MySQL中的循环

    MySQL中的三中循环 while . loop .repeat 求 1-n 的和第一种 while 循环 : /* while循环语法: while 条件 DO 循环体; end while; */ ...

  5. StringBuffer类和StringBuilder类

    StringBuffer类和StringBuilder类 三者比较 String 不可变字符序列 底层用char[]存储 StringBuffer 可变的字符序列 线程安全的 效率低 底层结构使用ch ...

  6. UVA1104 芯片难题 Chips Challenge

    题目链接 题意 网格上放点,有些强制放,有些不能放,有些可以放可以不放.要求: 第 \(i\) 行的点数 = 第 \(i\) 列的点数 每一行每一列的点数不超过总点数的 \(k\) 倍(\(k\) 已 ...

  7. DJANGO-天天生鲜项目从0到1-002-用户模块-注册

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  8. Linux上搭建文件浏览的web服务(创建软件仓库)(一)

    软件仓库的创建方式有很多,这是一种很简单的创建方式: python -m SimpleHTTPServer 快速搭建一个http服务,提供一个文件浏览的web服务. 使用:Python SimpleH ...

  9. three.js 欧拉角和四元数

    这篇郭先生就来说说欧拉角和四元数,欧拉角和四元数的优缺点是老生常谈的话题了,使用条件我就不多说了,我只说一下使用方法. 1. 欧拉角(Euler) 欧拉角描述一个旋转变换,通过指定轴顺序和其各个轴向上 ...

  10. PHP gregoriantojd() 函数

    ------------恢复内容开始------------ 实例 把格利高里历法的日期转换为儒略日计数,然后再转换回格利高里历法的日期: <?php$jd=gregoriantojd(6,20 ...