《Go語(yǔ)言從入門到精通》用Go語(yǔ)言進(jìn)行數(shù)學(xué)、科學(xué)領(lǐng)域的計(jì)算_第1頁(yè)
《Go語(yǔ)言從入門到精通》用Go語(yǔ)言進(jìn)行數(shù)學(xué)、科學(xué)領(lǐng)域的計(jì)算_第2頁(yè)
《Go語(yǔ)言從入門到精通》用Go語(yǔ)言進(jìn)行數(shù)學(xué)、科學(xué)領(lǐng)域的計(jì)算_第3頁(yè)
《Go語(yǔ)言從入門到精通》用Go語(yǔ)言進(jìn)行數(shù)學(xué)、科學(xué)領(lǐng)域的計(jì)算_第4頁(yè)
《Go語(yǔ)言從入門到精通》用Go語(yǔ)言進(jìn)行數(shù)學(xué)、科學(xué)領(lǐng)域的計(jì)算_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

用Go語(yǔ)言進(jìn)行數(shù)學(xué)、科學(xué)領(lǐng)域的計(jì)算Go語(yǔ)言從入門到精通詳細(xì)了解Go語(yǔ)言表達(dá)式的應(yīng)用學(xué)習(xí)在Go語(yǔ)言中如何進(jìn)行異常處理01EXPRESSION02MATHLIBS03EXCEPTIONtarget目標(biāo)了解和掌握系統(tǒng)自帶的和第三方數(shù)學(xué)庫(kù)目錄導(dǎo)航5.15.25.3表達(dá)式用表達(dá)式進(jìn)行數(shù)學(xué)計(jì)算利用系統(tǒng)自帶的數(shù)學(xué)庫(kù)進(jìn)行計(jì)算……Contents表達(dá)式的概念表達(dá)式表達(dá)的是一個(gè)計(jì)算過程,參與該計(jì)算過程的有數(shù)值、常量與變量、操作符(包括運(yùn)算符)、函數(shù)等,表達(dá)式最終計(jì)算的結(jié)果一般是一個(gè)數(shù)值。簡(jiǎn)單地說,表達(dá)式就是通過一組計(jì)算獲取某個(gè)結(jié)果值的算式。最簡(jiǎn)單的表達(dá)式——單個(gè)數(shù)值或變量18-26.970xFFEE"abcde"truefalsePianumber1操作符(運(yùn)算符)

+、-、*、/、%==、!=、>、>=、<、<=&&、||、!&、|、^、&^>>、<<函數(shù)在表達(dá)式中的作用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)}可以替代操作符并且可實(shí)現(xiàn)的功能更多表達(dá)式中計(jì)算的優(yōu)先級(jí)順序

函數(shù)的優(yōu)先級(jí)最高;其次是一元運(yùn)算符;再其次是二元操作符,二元操作符之間的運(yùn)算優(yōu)先級(jí)如下:

*、/、%、<<、>>、&、&^等操作符優(yōu)先級(jí)最高,+、-、|、^次之,==、!=、<、<=、>、>=再次之,然后是&&,最后是||;相同優(yōu)先級(jí)的操作符或函數(shù),將按照從左到右的順序依次進(jìn)行計(jì)算;可以通過圓括號(hào)改變計(jì)算的優(yōu)先級(jí),最里層嵌套的圓括號(hào)內(nèi)的子表達(dá)式運(yùn)算優(yōu)先級(jí)是最高的,然后是較外層的圓括號(hào),并如此逐級(jí)向外進(jìn)行運(yùn)算。函數(shù)參數(shù)中如果有表達(dá)式,每個(gè)參數(shù)獨(dú)立進(jìn)行計(jì)算。復(fù)雜的表達(dá)式計(jì)算示例func

add(a,

b

int)

int

{

return

a

+

b}

func

main()

{

a

:=

3*(20-add(4,

5)%6)

>

18

t.Printfln("a

=

%v",

a)}

表達(dá)式中數(shù)據(jù)類型一致性

表達(dá)式中,大多數(shù)二元運(yùn)算符連接的參與運(yùn)算的數(shù)值類型必須一致如果要實(shí)現(xiàn)類型不一致的運(yùn)算,可以進(jìn)行強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換,或者自定義函數(shù)func

add(a

int,

b

float64)

float64

{

return

float64(a)

+

b}

func

main()

{

x

:=

15

y

:=

25.6

t.Printfln("%v",

add(x,

y))}目錄導(dǎo)航5.15.25.3……表達(dá)式用表達(dá)式進(jìn)行數(shù)學(xué)計(jì)算利用系統(tǒng)自帶的數(shù)學(xué)庫(kù)進(jìn)行計(jì)算……ContentsBMI指數(shù)的引入嚴(yán)格的語(yǔ)法規(guī)范體重指數(shù)(BodyMassIndex)是國(guó)際上常用于衡量人體胖瘦程度以及是否健康的一個(gè)標(biāo)準(zhǔn),它的公式是BMI=W÷H2,其中BMI是體重指數(shù)(嚴(yán)謹(jǐn)?shù)卣f應(yīng)該叫身體質(zhì)量指數(shù),mass是物理上質(zhì)量的意思)的縮寫,W指人的體重(單位是千克),H指人的身高(單位是米)。BMI指數(shù)的計(jì)算及應(yīng)用意義BMI=W/(H*H)因?yàn)镠2=H*H,所以該表達(dá)式與體重指數(shù)公式是等價(jià)的。對(duì)于成人,目前用于中國(guó)的分類標(biāo)準(zhǔn)大致是: 偏瘦:BMI<18.5

正常:18.5<=BMI<24

偏胖:24<=BMI<28

肥胖:28<=BMI<30

重度肥胖:BMI>=30基本計(jì)算與結(jié)果輸出

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("重度肥胖")

}命令行參數(shù)package

main

import

(

t

"tools"

"os")

func

main()

{

args

:=

os.Args

for

i,

v

:=

range

args

{

t.Printfln("命令行參數(shù)%v:%v",

i,

v)

}

}

使用命令行參數(shù)傳入體重和身高

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)……目錄導(dǎo)航5.25.35.4……用表達(dá)式進(jìn)行數(shù)學(xué)計(jì)算利用系統(tǒng)自帶的數(shù)學(xué)庫(kù)進(jìn)行計(jì)算用Go語(yǔ)言進(jìn)行科學(xué)計(jì)算……Contents查閱Go語(yǔ)言文檔的方法1.godoc2.pkg.go.devmath包的Pow函數(shù)math包的Pow函數(shù)BMI:=W/math.Pow(H,2)用math/rand包產(chǎn)生隨機(jī)數(shù)

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)目錄導(dǎo)航5.35.45.5……利用系統(tǒng)自帶的數(shù)學(xué)庫(kù)進(jìn)行計(jì)算用Go語(yǔ)言進(jìn)行科學(xué)計(jì)算使用math/big包……Contents向量在Go語(yǔ)言中的表達(dá)r1

:=

[]float64{1.2,

2.4,

3.6}一個(gè)三維向量向量的余弦相似度

計(jì)算余弦相似度的函數(shù)func

CalCosSim(f1,

f2

[]float64)

float64

{

l1

:=

len(f1)

l2

:=

len(f2)

if

l1

!=

l2

{

Printfln("兩個(gè)向量長(zhǎng)度不一致,f1的長(zhǎng)度是:%v,f2的長(zhǎng)度是:%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}調(diào)用計(jì)算余弦相似度的函數(shù)

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目錄導(dǎo)航5.45.55.6……用Go語(yǔ)言進(jìn)行科學(xué)計(jì)算使用math/big包計(jì)算中的異常處理……Contentsmath/big包處理超大數(shù)或超高精度數(shù)值的計(jì)算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)大多數(shù)時(shí)候需要使用函數(shù)而非運(yùn)算符來進(jìn)行賦值與計(jì)算改進(jìn)的余弦相似度計(jì)算

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目錄導(dǎo)航5.55.65.7……使用math/big包計(jì)算中的異常處理使用第三方包進(jìn)行復(fù)雜數(shù)學(xué)計(jì)算……Contentspanic-defer-recover機(jī)制panic:異常終止defer:保證退出時(shí)的清理recover:嘗試容納錯(cuò)誤繼續(xù)運(yùn)行匿名函數(shù)

a

:=

func()

{

t.Printfln("test")

}

b

:=

a

b()

func(n

int)

{

t.Printfln("got

%v",

n)

}(8)

Go語(yǔ)言的延遲處理機(jī)制func

main()

{

defer

func()

{

println("func1")

}()

defer

println("func2")

println("main")

}

Go語(yǔ)言的異常處理機(jī)制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完美結(jié)合異常的傳遞順序函數(shù)中產(chǎn)生的異常如果沒有處理,會(huì)傳遞到它的外部調(diào)用者所在的函數(shù),如此一直“向上”傳遞,直至main函數(shù)如果main函數(shù)也沒有處理,則整個(gè)程序會(huì)被強(qiáng)行中止。使用runtime庫(kù)輸出更多的異常信息func

divide(a,

b

int)

int

{

return

a

/

b}

func

main()

{

defer

func()

{

if

r

:=

recover();

r

!=

nil

{

t.Printfln("發(fā)生異常,錯(cuò)誤信息:%v",

r)

_,

fn,

ln,

okt

:=

runtime.Caller(0)

t.Printfln("文件名:

%v,

行號(hào):

%v,

ok:

%v",

fn,

ln,

okt)

t.Printfln("調(diào)用棧:%v",

string(debug.Stack()))

}

else

{

t.Printfln("程序正常結(jié)束")

}

}()

t.Printfln("除法結(jié)果:%v",

divide(3,

0))}使用runtime庫(kù)輸出的結(jié)果示例發(fā)生異常,錯(cuò)誤信息:runtimeerror:integerdividebyzero文件名:C:/goprjs/src/test/test.go,行號(hào):18,ok:true調(diào)用棧: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目錄導(dǎo)航5.65.75.8……計(jì)算中的異常處理使用第三方包進(jìn)行復(fù)雜數(shù)學(xué)計(jì)算使用第三方圖表庫(kù)輔助科學(xué)計(jì)算Contents矩陣計(jì)算——gonum/mat包

/topxeq/goexamples/blob/master/gonum1/gonum1.go矩陣定義與矩陣乘法

//

定義參與運(yùn)算的矩陣

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})

//

定義用于存放計(jì)算結(jié)果的矩陣c

var

c

mat.Dense

//

進(jìn)行矩陣乘法運(yùn)算

c.Mul(a,

b)

矩陣計(jì)算結(jié)果輸出

//

用gonum/mat包中的格式來輸出結(jié)果矩陣c的信息

cOutput

:=

mat.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論