我的Go+语言初体验——(6)整型有理数数据类型
我的Go+語言初體驗——(6)整型有理數數據類型
“我的Go+語言初體驗” | 征文活動進行中…
Go+ 語言使用后綴 ‘r’ 表示有理數,支持整型、分數型、浮點型三種有理數數據類型(Rational number)。
在整型有理數變量聲明時,可以同時對變量賦值;如果對整型有理數變量只聲明而沒有賦值,其初始值不是 0,而是 <nil>。
整型有理數的基本運算如加減乘除與通常的整數運算相同,按照先乘除、后加減的順序進行運算。
整型有理數變量可以與整型有理數類型的常數、分數形式的有理數類型的常數和整型常數進行運算,不能與浮點數類型的常數進行運算。
整型有理數變量可以與整型變量進行運算,運算結果為整型有理數。不允許對整型有理數與浮點型變量進行運算。
1. 有理數數據類型
在數學上,數字分為實數和復數,實數分為有理數和無理數。有理數是整數和分數的集合,整數可以表示為分母為 1 的分數,因此可以用分數來表示任意的有理數。
在計算機語言中,數據類型是數據的一種屬性,類型系統提供了各種數據類型的定義、實現和使用方法。大多數編程語言支持數字的數據類型有:無符號整數、有符號整數、浮點數和復數類型,有些類型還可以進一步分為不同的位數,如 8位、16位、32位和64位。但是,現有計算機語言中,幾乎都沒有提供有理數數據類型,一些計算機語言允許用戶定義有理數數據結構。
Go+ 語言除了這些常用的數字類型之外,還支持有理數(Rational number)數據類型。
Go+ 語言中使用后綴 ‘r’ 表示有理數,支持整型、分數型、浮點型三種有理數數據類型:
**bigint:整型有理數。**支持 64位以上的大整數,例如 “1r<<65” 的值等于 2 的 65 次冪,“1r<<65 - 100” 的值等于 2 的 65 次冪減去 100 的結果。
**bigrat:分數型有理數。**支持分數形式表示的有理數,例如 “4/5r” 的值等于分數 4/5。
bigfloat:浮點型有理數0支持浮點數形式表示的有理數。
2. 整型有理數的變量聲明與賦值
2.1 變量聲明與賦值
Go+ 語言使用 var 關鍵字聲明變量,整型有理數的變量聲明方法如下:
var varname bigint // 聲明變量 varname 為 bigint 類型
【例程 1】變量聲明
// Example 1: declaration and assignment of bigint type variables import "reflect" var bint1 bigint = 1r << 100 var bint2 bigintprintln reflect.TypeOf(bint1), ", bint1 =: ", bint1 println reflect.TypeOf(bint2), ", bint2 =: ", bint2/* Running results: builtin.Gop_bigint , bint1 =: 1267650600228229401496703205376 builtin.Gop_bigint , bint2 =: <nil> */程序說明:
(1)在整型有理數變量 bint1 聲明時,可以同時對變量 bint1 賦值。“1r << 100” 的值等于 2 的 100 次冪。
(2)對整型有理數變量 bint2 只聲明而沒有賦值,其初始值不是 0,而是 “<nil>”。
2.2 不指定變量類型
Go+ 語言允許不通過 var 聲明變量,在不指定變量類型而直接對變量進行初始化并賦值,編譯器將自動推導變量類型。但需要注意的是,如果初始化的數值沒有后綴 ‘r’,系統將優先將其識別為整型變量 int。
【例程 2】變量初始化時不指定類型
// Example 2: variable initialization without specified type import "reflect" bint3 := 306 bint4 := 306r bint5 := 9223372036854775807 bint6 := 9223372036854775808r //bint6 := 9223372036854775808 // constant 9223372036854775808 overflows intprintln reflect.TypeOf(bint3), ", bint3 =: ", bint3 println reflect.TypeOf(bint4), ", bint4 =: ", bint4 println reflect.TypeOf(bint5), ", bint5 =: ", bint5 println reflect.TypeOf(bint6), ", bint6 =: ", bint6/* Running results: int , bint3 =: 306 builtin.Gop_bigint , bint4 =: 306 int , bint5 =: 9223372036854775807 builtin.Gop_bigint , bint6 =: 9223372036854775808 */程序說明:
(1)Go+ 語言中的整型變量 int64 的取值范圍是:-9223372036854775808 ~ 9223372036854775807。在此范圍內的整數,帶有后綴 ‘r’ 則被識別為整型有理數變量,不帶后綴 ‘r’ 則被識別為整型變量 int。
(2)在初始化變量時,如果賦值的數值不帶后綴 ‘r’,編譯器識別變量為整型變量 int,如 bint3, bint5。
(3)在初始化變量時,如果賦值的數值帶有后綴 ‘r’,識別變量為整型有理數變量 bigint,如 bint4, bint6。
(4)但是,超出 int64 取值范圍的大整數(如:9223372036854775808),如果不帶后綴 ‘r’ 就會報錯。
2.3 用表達式對變量賦值
【例程 3】使用表達式對整型有理數變量賦值
// Example 3: assigning values to variables using expressions // bigint type, is allowed to define large integers bigger than int64 var bint7 bigint = 1r << 65 // the value is equal to the 65th power of 2 var bint8 bigint = 1r<<65 - 100 // expression is allowed in definition var bint9 bigint = -3r<<36 + 200 // define a negative integer rational var bint10 bigint = 0 // 0 is allowed as a integer rationalprintln "bint7 = 1r << 65: ", bint7 println "bint8 = 1r<<65 - 100: ", bint8 println "bint9 = -3r<<36 + 200: ", bint9 println "bint10 = 0: ", bint10/* Running results: bint7 = 1r << 65: 36893488147419103232 bint8 = 1r<<65 - 100: 36893488147419103132 bint9 = -3r<<36 + 200: -206158430008 bint10 = 0: 0 */程序說明:
(1)可以用表達式對整型有理數變量進行賦值,表達式可以混合使用帶有后綴 ‘r’ 的整型有理數常數和不帶后綴 ‘r’ 的整型常數。
(2)“1r<<65” 的值等于 2 的 65 次冪,“1r<<65 - 100” 的值等于 2 的 65 次冪減去 100 的結果,"-3r<<36 + 200" 的值等于 2 的 65 次冪乘以 -3后加 200 的結果。
(3)正整數、負整數和零都可以被賦值給整型有理數變量。
3. 整型有理數的運算
3.1 整型有理數的基本運算
整型有理數的基本運算,如加減乘除,其計算方法和規則與通常的整數運算相同。
【例程 4】整型有理數的基本運算
// Example 4: Basic operations of integer rational numbers var bint1 bigint = 1r << 65 var bint2 bigint = 1r<<36 + 100 var bint3 bigint = 9223372036854775808r var bint4 bigint = 306rprintln "bint1 + bint2 = ", bint1+bint2 println "bint1 - bint2 = ", bint1-bint2 println "bint1 * bint2 = ", bint1*bint2 println "bint1 / bint2 = ", bint1/bint2// The operation rule is multiplication and division before addition and subtraction. println "bint1 + bint2 / bint3 = ", bint1+bint2/bint3 println "(bint1 + bint2) / bint3 = ", (bint1+bint2)/bint3 println "bint1 + (bint2 / bint3) = ", bint1+(bint2/bint3)/* Running results: bint1 + bint2 = 36893488216138580068 bint1 - bint2 = 36893488078699626396 bint1 * bint2 = 2535301204145807617735316733952 bint1 / bint2 = 536870911 bint1 + bint2 / bint3 = 36893488147419103232 (bint1 + bint2) / bint3 = 4 bint1 + (bint2 / bint3) = 36893488147419103232 */程序說明:
(1)整型有理數的基本運算,如加減乘除,其計算方法和規則與通常的整數運算相同。
(2)整型有理數的基本運算,按照先乘除、后加減的順序進行運算。
(3)整型有理數表達式的運算結果如果不是整數,則對運算結果自動取整。
3.2 整型有理數與常數的運算
整型有理數變量可以與整型有理數類型的常數進行加減乘除運算,也可以與整型常數進行運算。
【例程 5】整型有理數與整型常數的運算
// Example 5: Basic operations with constants of integer (rational) type var bint1 bigint = 1r << 65 var bint2 bigint = 1r<<36 + 100 var bint3 bigint = 9223372036854775808r var bint4 bigint = 306r// The operations with constants of integer rational type println "bint1 + 1r<<60 = ", bint1+1r<<60 println "bint2 - 1r<<36 = ", bint2-1r<<36 println "bint3 * 306r = ", bint3*306r println "bint3 / 306r = ", bint3/306r// The operations with constants of integer type println "bint1 + 160 = ", bint1+160 println "bint2 - 160 = ", bint1-160 println "bint3 * 306 = ", bint3*306 println "bint3 / 3014 = ", bint3/3014// The operations with constants of rational number in fractional form println "bint1 + 160/1r = ", bint1+160/1r println "bint2 - 160/5r = ", bint1-160/5r println "bint3 * 305/306r = ", bint3*305/306r println "bint3 / 5/100r = ", bint3/5/100rprintln "bint4 * 0 = ", bint4*0 println "bint4 / 0 = ", bint4/0 // panic: division by zero/* Running results: bint1 + 1r<<60 = 38046409652025950208 bint2 - 1r<<36 = 100 bint3 * 306r = 2822351843277561397248 bint3 / 306r = 30141738682531947bint1 + 160 = 36893488147419103392 bint2 - 160 = 36893488147419103072 bint3 * 306 = 2822351843277561397248 bint3 / 3014 = 3060176521849627bint1 + 160/1r = 36893488147419103392 bint2 - 160/5r = 36893488147419103200 bint3 * 305/306r = 9193230298172243860 bint3 / 5/100r = 18446744073709551bint4 * 0 = 0 panic: division by zero */程序說明:
(1)整型有理數變量可以與整型有理數類型的常數進行加減乘除運算,也可以與整型常數進行運算。
(2)整型有理數變量可以與分數型有理數類型的常數進行運算,運算結果轉換為整型有理數。
(3)整型有理數變量運算,被 0 除時將發生錯誤,系統提示為:“panic: division by zero”。
一般地,整型有理數不能與浮點數類型的常數進行加減乘除運算。
【例程 6】整型有理數與浮點數的運算
// Example 6: Basic operations with constants of float type var bint1 bigint = 1r << 65// The operations with constants of float type println "bint1 + 160.0 = ", bint1+160.0 println "bint1 - 160.0 = ", bint1-160.0 println "bint1 * 306.0 = ", bint1*306.0 println "bint1 / 3014.0 = ", bint1/3014.0//println "bint1 + 160.5 = ", bint1+160.5 // invalid operation //println "bint1 - 160.5 = ", bint1-160.5 // invalid operation //println "bint1 * 306.5 = ", bint1*306.5 // invalid operation //println "bint1 / 3014.5 = ", bint1/3014.5 // // invalid operation/* Running results: bint1 + 160.0 = 36893488147419103392 bint1 - 160.0 = 36893488147419103072 bint1 * 306.0 = 11289407373110245588992 bint1 / 3014.0 = 12240706087398508 */程序說明:
(1)在第一組加減乘除運算中,算式中浮點數常數的數值都是整數,可以轉換為整型常數,因此運算可以執行,運算結果也是正確的。
(2)在第二組加減乘除運算中,算式中浮點數常數的數值不是整數,不能自動轉換為整型常數,這些運算都不能執行,系統提示為 “無效操作”:
invalid operation: mismatched types github.com/goplus/gop/builtin.Gop_bigint and untyped float
這表明,**Go+ 語言中不允許對整型自然數與浮點型常數進行運算。**雖然第一組運算可以進行,但我們也應該避免對整型自然數與浮點型常數進行運算。
3.3 整型有理數與變量的運算
Go+ 語言中整型有理數變量可以與整型變量進行運算,運算結果為整型有理數。不允許對整型有理數與浮點型變量進行運算。
【例程 7】整型有理數與整型變量的運算
// Example 7: Basic operations with integer variables import "reflect" var bint1 bigint = 1r << 36 var x int = 306println "bint1 + x*5 = ", bint1+x*5 // bint1 + x*5 = 68719478266 println "bint1 - x/2 = ", bint1-x/2 // bint1 - x/2 = 68719476583 println "bint1 * x = ", bint1*x // bint1 * x = 21028159881216 println "bint1 / x = ", bint1/x // bint1 / x = 224573453 println "bint1 / (x*x) = ", bint1/(x*x) // bint1 / (x*x) = 733900println reflect.TypeOf(bint1+x*5) // builtin.Gop_bigint println reflect.TypeOf(bint1/(x*x)) // builtin.Gop_bigint【例程 8】整型有理數與浮點數的運算
// Example 8: Basic operations with float variables var bint1 bigint = 1r << 36 var y float64 = 36println "bint4 + y = ", bint1+y //invalid operation4. 總結
-
Go+ 語言使用后綴 ‘r’ 表示有理數,支持整型、分數型、浮點型三種有理數數據類型(Rational number)。
-
在整型有理數變量聲明時,可以同時對變量賦值;如果對整型有理數變量只聲明而沒有賦值,其初始值不是 0,而是 “”。
-
整型有理數的基本運算如加減乘除,其計算方法和規則與通常的整數運算相同,按照先乘除、后加減的順序進行運算。
-
整型有理數變量可以與整型有理數類型的常數、分數形式的有理數類型的常數和整型常數進行運算,不能與浮點數類型的常數進行運算。
-
整型有理數變量可以與整型變量進行運算,運算結果為整型有理數。不允許對整型有理數與浮點型變量進行運算。
【本節完】
版權聲明:
原創作品,轉載必須標注原文鏈接:(https://blog.csdn.net/youcans/article/details/121755262)
Copyright 2021 youcans, XUPT
Crated:2021-12-06
歡迎關注『我的Go+語言初體驗』系列,持續更新中…
我的Go+語言初體驗——(1)超詳細安裝教程
我的Go+語言初體驗——(2) IDE 詳細安裝教程
我的Go+語言初體驗——(3)Go+ 數據類型
我的Go+語言初體驗——(4)零基礎學習 Go+ 爬蟲
我的Go+語言初體驗——(5)Go+ 基本語法之 Switch
我的Go+語言初體驗——(6)整型有理數數據類型
“我的Go+語言初體驗” | 征文活動進行中…
總結
以上是生活随笔為你收集整理的我的Go+语言初体验——(6)整型有理数数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenCV 例程200篇】09. 图
- 下一篇: 云 文件 服务器 只存,云 文件 服务