《Go语言从入门到精通》用Go语言进行数学、科学领域的计算_第1页
《Go语言从入门到精通》用Go语言进行数学、科学领域的计算_第2页
《Go语言从入门到精通》用Go语言进行数学、科学领域的计算_第3页
《Go语言从入门到精通》用Go语言进行数学、科学领域的计算_第4页
《Go语言从入门到精通》用Go语言进行数学、科学领域的计算_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论