版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用Go语言进行数学、科学领域的计算Go语言从入门到精通详细了解Go语言表达式的应用学习在Go语言中如何进行异常处理01EXPRESSION02MATHLIBS03EXCEPTIONtarget目标了解和掌握系统自带的和第三方数学库目录导航5.15.25.3表达式用表达式进行数学计算利用系统自带的数学库进行计算……Contents表达式的概念表达式表达的是一个计算过程,参与该计算过程的有数值、常量与变量、操作符(包括运算符)、函数等,表达式最终计算的结果一般是一个数值。简单地说,表达式就是通过一组计算获取某个结果值的算式。最简单的表达式——单个数值或变量18-26.970xFFEE"abcde"truefalsePianumber1操作符(运算符)
+、-、*、/、%==、!=、>、>=、<、<=&&、||、!&、|、^、&^>>、<<函数在表达式中的作用package
main
import
(
"fmt"
t
"tools")
func
add(a,
b
int)
int
{
return
a
+
b}
func
main()
{
fmt.Printf("2+3=%v\n",
2+3)
t.Printfln("2+3=%v",
2+3)}可以替代操作符并且可实现的功能更多表达式中计算的优先级顺序
函数的优先级最高;其次是一元运算符;再其次是二元操作符,二元操作符之间的运算优先级如下:
*、/、%、<<、>>、&、&^等操作符优先级最高,+、-、|、^次之,==、!=、<、<=、>、>=再次之,然后是&&,最后是||;相同优先级的操作符或函数,将按照从左到右的顺序依次进行计算;可以通过圆括号改变计算的优先级,最里层嵌套的圆括号内的子表达式运算优先级是最高的,然后是较外层的圆括号,并如此逐级向外进行运算。函数参数中如果有表达式,每个参数独立进行计算。复杂的表达式计算示例func
add(a,
b
int)
int
{
return
a
+
b}
func
main()
{
a
:=
3*(20-add(4,
5)%6)
>
18
t.Printfln("a
=
%v",
a)}
表达式中数据类型一致性
表达式中,大多数二元运算符连接的参与运算的数值类型必须一致如果要实现类型不一致的运算,可以进行强制数据类型转换,或者自定义函数func
add(a
int,
b
float64)
float64
{
return
float64(a)
+
b}
func
main()
{
x
:=
15
y
:=
25.6
t.Printfln("%v",
add(x,
y))}目录导航5.15.25.3……表达式用表达式进行数学计算利用系统自带的数学库进行计算……ContentsBMI指数的引入严格的语法规范体重指数(BodyMassIndex)是国际上常用于衡量人体胖瘦程度以及是否健康的一个标准,它的公式是BMI=W÷H2,其中BMI是体重指数(严谨地说应该叫身体质量指数,mass是物理上质量的意思)的缩写,W指人的体重(单位是千克),H指人的身高(单位是米)。BMI指数的计算及应用意义BMI=W/(H*H)因为H2=H*H,所以该表达式与体重指数公式是等价的。对于成人,目前用于中国的分类标准大致是: 偏瘦:BMI<18.5
正常:18.5<=BMI<24
偏胖:24<=BMI<28
肥胖:28<=BMI<30
重度肥胖:BMI>=30基本计算与结果输出
W
:=
65.0
H
:=
1.75
BMI
:=
W
/
(H
*
H)
t.Printfln("BMI:
%.2f",
BMI)
if
BMI
<
18.5
{
t.Printfln("偏瘦")
}
else
if
(18.5
<=
BMI)
&&
(BMI
<
24)
{
t.Printfln("正常")
}
else
if
24
<=
BMI
&&
BMI
<
28
{
t.Printfln("偏胖")
}
else
if
28
<=
BMI
&&
BMI
<
30
{
t.Printfln("肥胖")
}
else
if
BMI
>=
30
{
t.Printfln("重度肥胖")
}命令行参数package
main
import
(
t
"tools"
"os")
func
main()
{
args
:=
os.Args
for
i,
v
:=
range
args
{
t.Printfln("命令行参数%v:%v",
i,
v)
}
}
使用命令行参数传入体重和身高
var
W
float64
var
H
float64
fmt.Sscanf(args[1],
"%f",
&W)
fmt.Sscanf(args[2],
"%f",
&H)
t.Printfln("体重:
%.2f",
W)
t.Printfln("身高:
%.2f",
H)
BMI
:=
W
/
(H
*
H)……目录导航5.25.35.4……用表达式进行数学计算利用系统自带的数学库进行计算用Go语言进行科学计算……Contents查阅Go语言文档的方法1.godoc2.pkg.go.devmath包的Pow函数math包的Pow函数BMI:=W/math.Pow(H,2)用math/rand包产生随机数
args
:=
os.Args
rand.Seed(time.Now().Unix())
var
floatList1
[10]float64
var
floatList2
[10]float64
for
i
:=
0;
i
<
10;
i++
{
floatList1[i]
=
rand.Float64()
*
20
floatList2[i]
=
rand.NormFloat64()*2
+
10
}
t.Printfln("%#v",
floatList1)
t.Printfln("%#v",
floatList2)目录导航5.35.45.5……利用系统自带的数学库进行计算用Go语言进行科学计算使用math/big包……Contents向量在Go语言中的表达r1
:=
[]float64{1.2,
2.4,
3.6}一个三维向量向量的余弦相似度
计算余弦相似度的函数func
CalCosSim(f1,
f2
[]float64)
float64
{
l1
:=
len(f1)
l2
:=
len(f2)
if
l1
!=
l2
{
Printfln("两个向量长度不一致,f1的长度是:%v,f2的长度是:%v",
l1,
l2)
return
-1
}
var
rr
float64
=
0.0
var
f1r
float64
=
0.0
var
f2r
float64
=
0.0
for
i
:=
0;
i
<
l1;
i++
{
rr
+=
f1[i]
*
f2[i]
f1r
+=
f1[i]
*
f1[i]
f2r
+=
f2[i]
*
f2[i]
}
var
rs
float64
=
rr
/
(math.Sqrt(f1r)
*
math.Sqrt(f2r))
return
rs}调用计算余弦相似度的函数
v1
:=
[]float64{1.2,
2.4,
3.6}
v2
:=
[]float64{1.3,
2.4,
3.7}
v3
:=
[]float64{3.5,
4.8,
9.9}
t.Printfln("v1
-
v1:
%.5f",
t.CalCosSim(v1,
v1))
t.Printfln("v1
-
v2:
%.5f",
t.CalCosSim(v1,
v2))
t.Printfln("v1
-
v3:
%.5f",
t.CalCosSim(v1,
v3))v1-v1:1.00000v1-v2:0.99980v1-v3:0.99075目录导航5.45.55.6……用Go语言进行科学计算使用math/big包计算中的异常处理……Contentsmath/big包处理超大数或超高精度数值的计算math/big包
b1
:=
new(big.Float)
b1.SetFloat64(1.78)
b2
:=
new(big.Float).SetFloat64(2.69)
b3
:=
new(big.Float).Mul(b1,
b2)
f1,
_
:=
b3.Float64()
t.Printfln("f1=%v",
f1)大多数时候需要使用函数而非运算符来进行赋值与计算改进的余弦相似度计算
rr
:=
new(big.Float).SetFloat64(0.0)
f1r
:=
new(big.Float).SetFloat64(0.0)
f2r
:=
new(big.Float).SetFloat64(0.0)
for
i
:=
0;
i
<
l1;
i++
{
f1Sub
:=
new(big.Float).SetFloat64(f1[i])
f2Sub
:=
new(big.Float).SetFloat64(f2[i])
rr.Add(rr,
new(big.Float).Mul(f1Sub,
f2Sub))
f1r.Add(f1r,
new(big.Float).Mul(f1Sub,
f1Sub))
f2r.Add(f2r,
new(big.Float).Mul(f2Sub,
f2Sub))
}
tmp1
:=
new(big.Float).Mul(new(big.Float).Sqrt(f1r),
new(big.Float).Sqrt(f2r))
tmp2
:=
new(big.Float).Quo(rr,
tmp1)
tmp3,
_
:=
tmp2.Float64()
return
tmp3目录导航5.55.65.7……使用math/big包计算中的异常处理使用第三方包进行复杂数学计算……Contentspanic-defer-recover机制panic:异常终止defer:保证退出时的清理recover:尝试容纳错误继续运行匿名函数
a
:=
func()
{
t.Printfln("test")
}
b
:=
a
b()
func(n
int)
{
t.Printfln("got
%v",
n)
}(8)
Go语言的延迟处理机制func
main()
{
defer
func()
{
println("func1")
}()
defer
println("func2")
println("main")
}
Go语言的异常处理机制func
add(a,
b
int)
int
{
if
a+b
>
200
{
panic("a+b
>
200")
}
return
a
+
b}
func
main()
{
defer
func()
{
r
:=
recover()
t.Printfln("%v",
r)
}()
println(add(100,
200))}panic+defer+recover完美结合异常的传递顺序函数中产生的异常如果没有处理,会传递到它的外部调用者所在的函数,如此一直“向上”传递,直至main函数如果main函数也没有处理,则整个程序会被强行中止。使用runtime库输出更多的异常信息func
divide(a,
b
int)
int
{
return
a
/
b}
func
main()
{
defer
func()
{
if
r
:=
recover();
r
!=
nil
{
t.Printfln("发生异常,错误信息:%v",
r)
_,
fn,
ln,
okt
:=
runtime.Caller(0)
t.Printfln("文件名:
%v,
行号:
%v,
ok:
%v",
fn,
ln,
okt)
t.Printfln("调用栈:%v",
string(debug.Stack()))
}
else
{
t.Printfln("程序正常结束")
}
}()
t.Printfln("除法结果:%v",
divide(3,
0))}使用runtime库输出的结果示例发生异常,错误信息:runtimeerror:integerdividebyzero文件名:C:/goprjs/src/test/test.go,行号:18,ok:true调用栈:goroutine1[running]:runtime/debug.Stack(0x4d9972,0x21,0xc000075e58)C:/Go/src/runtime/debug/stack.go:24+0xaemain.main.func1()C:/goprjs/src/test/test.go:21+0x1bcpanic(0x4b9e00,0x575760)C:/Go/src/runtime/panic.go:513+0x1c7main.divide(...)C:/goprjs/src/test/test.go:10main.main()C:/goprjs/src/test/test.go:27+0x45目录导航5.65.75.8……计算中的异常处理使用第三方包进行复杂数学计算使用第三方图表库辅助科学计算Contents矩阵计算——gonum/mat包
/topxeq/goexamples/blob/master/gonum1/gonum1.go矩阵定义与矩阵乘法
//
定义参与运算的矩阵
a和
b
var
a
*mat.Dense
a
=
mat.NewDense(2,
3,
[]float64{
1,
2,
3,
4,
5,
6})
b
:=
mat.NewDense(3,
2,
[]float64{
1,
2,
3,
4,
5,
6})
//
定义用于存放计算结果的矩阵c
var
c
mat.Dense
//
进行矩阵乘法运算
c.Mul(a,
b)
矩阵计算结果输出
//
用gonum/mat包中的格式来输出结果矩阵c的信息
cOutput
:=
mat.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026内蒙古霍林河机场管理有限责任公司招聘工作人员3人备考题库附答案详解(综合卷)
- 2026年4月贵州遵义市赤水市公益性岗位人员招聘12人备考题库附完整答案详解【必刷】
- 泌尿外科尿路结石预防保健指导
- 2026广州南沙人力资源发展有限公司一线社工招聘备考题库附参考答案详解【综合题】
- 口腔颌面复合畸形矫治术后护理措施
- 2026广东阳江市阳春市招聘乡村公益性岗位12人备考题库(第六批)带答案详解(精练)
- 2026浙江温州市公证协会招聘1人备考题库含完整答案详解(各地真题)
- 2026云南临沧检测机构招聘食品检测聘用人员1人备考题库及参考答案详解(典型题)
- 糖尿病视网膜病变处理指导
- 2026西藏阿里地区日土县审计局招聘3名备考题库【考点提分】附答案详解
- 2025急性缺血性卒中血管内治疗并发症重症管理专家共识课件
- 2026年ipmpd级考试试题
- 2026年浙江机电职业技术学院单招职业技能考试备考试题带答案解析
- 义务教育道德与法治课程标准日常修订版(2022年版2025年修订)
- 2026年商丘学院单招(计算机)测试备考题库必考题
- 2025年卫生管理初级师考试真题及答案
- 企业信息系统维护手册与模板
- (2025年)政工师职称考试题库及答案
- 残疾人证核发与管理
- 安全员题库宝破解版及答案解析
- 《政务信息系统运行维护费用定额测算方法》
评论
0/150
提交评论