新建网站怎么做,高级seo是什么职位,wordpress按分类显示图片,WordPress优惠券主题我的Go语言初体验——#xff08;7#xff09;Go 分数型有理数数据类型
“我的Go语言初体验” | 征文活动进行中…
更多内容#xff0c;请参阅#xff1a; 我的Go语言初体验——#xff08;7#xff09;Go 分数型有理数数据类型 Go 语言使用后缀 ‘r’ 表示有理数…我的Go语言初体验——7Go 分数型有理数数据类型
“我的Go语言初体验” | 征文活动进行中…
更多内容请参阅 我的Go语言初体验——7Go 分数型有理数数据类型 Go 语言使用后缀 ‘r’ 表示有理数支持分数型有理数数据类型。分数型有理数的定义、运算比较复杂本文进行了较为系统的测试。 分数型有理数本质上是分子、分母均为整型有理数的数据结构。对分数型有理数变量赋值可以分子为整型数而分母为整型有理数或分子为整型有理数而分母为整型数或分子和分母都是整型有理数。 分数型有理数变量可以与分数型有理数类型的常数或变量进行加减乘除运算也可以与整型常数、整型有理数常数进行混合运算不能与其它类型变量进行混合运算。 由于有理数常量的表示中带有 “r” 和 “” 符号要特别注意其前后运算符号、常数的结合关系、运算优先次序。推荐使用括号 “()” 将其与前后表达式进行隔离以减少出错。 1. 有理数数据类型
有理数是整数和分数的集合整数可以表示为分母为 1 的分数因此可以用分数来表示任意的有理数。
Go 语言支持有理数Rational number数据类型使用后缀 ‘r’ 表示有理数支持整型、分数型、浮点型三种有理数数据类型 **bigint整型有理数。**支持 64位以上的大整数例如 “1r65” 的值等于 2 的 65 次幂“1r65 - 100” 的值等于 2 的 65 次幂减去 100 的结果。 **bigrat分数型有理数。**支持分数形式表示的有理数例如 “4/5r” 的值等于分数 4/5。 bigfloat浮点型有理数0支持浮点数形式表示的有理数。 分数型有理数本质上是分子、分母均为整型有理数的数据结构。 2. 分数型有理数的变量声明与赋值
2.1 变量声明与赋值
Go 语言使用 var 关键字声明变量分数型有理数bigrat的变量声明方法如下 var varname bigrat // 声明变量 varname 为 bigrat 类型 Go 语言允许对分数型有理数变量只声明不赋值但系统并不自动为其设置初始值如果直接调用将发生错误因此推荐在对分数型有理数变量声明时赋初始值。
**分数型有理数本质上是分子、分母均为整型有理数的数据结构。**因此对分数型有理数赋值可以分子为整型而分母为整型有理数或分子为整型有理数而分母为整型或分子和分母都是整型有理数。 【例程 1】变量声明
import reflectvar brat1 bigrat 4/5r
var brat2 bigrat 4r / 5
var brat3 bigrat (1r 36) / (3r 65)var brat4 bigrat // 这句没有报错但不推荐使用println reflect.TypeOf(brat1), , brat1 : , brat1
println reflect.TypeOf(brat2), , brat2 : , brat2
println reflect.TypeOf(brat3), , brat3 : , brat3
println reflect.TypeOf(brat4), , brat4 : , brat4 // brat4 尚未赋初值这句发生错误/* Running results
builtin.Gop_bigrat , brat1 : 4/5
builtin.Gop_bigrat , brat2 : 4/5
builtin.Gop_bigrat , brat3 : 1/1610612736
builtin.Gop_bigrat , brat4 : %!v(PANICString method: runtime error: invalid memory address or nil pointer dereference)
*/程序说明
1在分数型有理数变量声明时可以同时对变量赋值如 brat1~brat3。 2对分数型有理数变量赋值可以分子为整型而分母为整型有理数如brat1或分子为整型有理数而分母为整型如brat2或分子和分母都是整型有理数如brat3。 3对分数型有理数变量赋值系统自动对分数表达式通分化简如 brat3。注意 “(1r 36) / (3r 65)” 不能写成 “1r 36 / 3r 65”后者是非法的。 4对分数型有理数变量 brat4 只声明而没有赋值系统并不会对变量 brat2 设置初始值如果直接使用 brat2 将发生错误。 2.2 不指定变量类型
Go 语言允许不通过 var 声明变量在不指定变量类型而直接对变量进行初始化并赋值编译器将自动推导变量类型。
如果初始化的数值为整数且没有后缀 ‘r’系统将其识别为整型变量 int如果初始化的数值表达为分数形式且没有后缀 ‘r’系统将对其取整后识别为整型变量 int如果初始化的数值为整数且带有后缀 ‘r’系统将其识别为整型有理数变量 bigint如果初始化的数值表达为分数形式且带有后缀 ‘r’系统都将其识别为分数型有理数变量 bigrat如果初始化的数值表达为分数形式的表达式且带有后缀 ‘r’系统自动对分数表达式进行运算并化简。
【例程 2】变量初始化时不指定类型
// Example 2: variable initialization without specified type
import reflectbrat3 : 36
brat4 : 6 / 5
brat5 : 306r
brat6 : -4/16r
brat7 : -4/1r
brat8 : 0/1r
brat9 : 1r20 4/5r
brat10 : -(1r15 4) / (5r25 - 15)println reflect.TypeOf(brat3), , brat3 : , brat3
println reflect.TypeOf(brat4), , brat4 : , brat4
println reflect.TypeOf(brat5), , brat5 : , brat5
println reflect.TypeOf(brat6), , brat6 : , brat6
println reflect.TypeOf(brat7), , brat7 : , brat7
println reflect.TypeOf(brat8), , brat8 : , brat8
println reflect.TypeOf(brat9), , brat9 : , brat9
println reflect.TypeOf(brat10), , brat10 : , brat10/* Running results
int , brat3 : 36
int , brat4 : 1
builtin.Gop_bigint , brat5 : 306
builtin.Gop_bigrat , brat6 : -1/4
builtin.Gop_bigrat , brat7 : -4/1
builtin.Gop_bigrat , brat8 : 0/1
builtin.Gop_bigrat , brat9 : 5242884/5
builtin.Gop_bigrat , brat10 : -32772/167772145
*/程序说明
1赋值的数值不带后缀 ‘r’编译器识别变量为整型变量 int如 brat3, brat4。 2赋值的数值表示为整数形式带有后缀 ‘r’编译器识别变量为整型有理数变量 bigint如 brat5。 3赋值的数值表示为分数形式带有后缀 ‘r’识别变量为分数型有理数变量 bigrat如 brat6~brat10。 4赋值的数值表示为分数 表达式编译器自动对编译器进行计算、化简。 2.3 用表达式对变量赋值
Go 语言允许在通过 var 声明变量时对变量赋值也允许不指定变量类型而直接对变量进行初始化并赋值这两种情况下都可以使用表达式对变量赋值。
使用表达式对变量赋值编译器自动对表达式进行计算使用表达式对变量赋值编译器自动对表达式的计算结果进行通分化简使分子分母没有公约数使用表达式对变量赋值允许使用整型常数、整型有理数常数与分数型有理数常数或变量混合运算表达式。
【例程 3】使用表达式对分数型有理数变量赋值
// Example 3: assigning values to variables using expressions
import reflectvar brat1 bigrat 4/5r
var brat2 bigrat 0/1r
var brat3 bigrat brat1 - 16/4r
var brat4 bigrat 1080 3/6r
var brat5 bigrat 1080r 3/6r
var brat6 bigrat 1080 0/1r
var brat7 bigrat 1r36 6/10r
var brat8 bigrat (1r100 - 1) / (5r36 1)println reflect.TypeOf(brat1), , brat1 : , brat1
println reflect.TypeOf(brat2), , brat2 : , brat2
println reflect.TypeOf(brat3), , brat3 : , brat3
println reflect.TypeOf(brat4), , brat4 : , brat4
println reflect.TypeOf(brat5), , brat5 : , brat5
println reflect.TypeOf(brat6), , brat6 : , brat6
println reflect.TypeOf(brat7), , brat7 : , brat7
println reflect.TypeOf(brat8), , brat8 : , brat8/* Running results
builtin.Gop_bigrat , brat1 : 4/5
builtin.Gop_bigrat , brat2 : 0/1
builtin.Gop_bigrat , brat3 : -16/5
builtin.Gop_bigrat , brat4 : 2161/2
builtin.Gop_bigrat , brat5 : 2161/2
builtin.Gop_bigrat , brat6 : 1080/1
builtin.Gop_bigrat , brat7 : 343597383683/5
builtin.Gop_bigrat , brat8 : 422550200076076467165567735125/114532461227
*/程序说明
1可以用表达式对分数型有理数变量进行赋值表达式可以混合使用带有后缀 ‘r’ 的整型有理数常数和不带后缀 ‘r’ 的整型常数。 2编译器自动对表达式进行计算如 brat3~brat8。 3编译器自动对表达式的计算结果进行通分化简使分子分母没有公约数如 brat4, brat5, brat7。 4使用表达式对分数型有理数变量赋值允许使用带有整型常数、整型有理数常数的混合运算表达式如 brat4~brat6。 5使用表达式对分数型有理数变量赋值允许使用带有分数型有理数常数或变量的表达式如 brat3, brat8。 3. 分数型有理数的运算
分数型有理数变量可以与分数型有理数类型的常数或变量进行加减乘除运算也可以与整型常数、整型有理数常数进行混合运算不能与其它类型变量进行混合运算。
3.1 分数型有理数运算式接受的数据类型
分数型有理数的运算表达式中
运算式中允许使用整型常数、整型有理数常数运算式中允许使用分数型有理数常数允许使用分数型有理数变量运算式中允许使用 “分数”不允许使用浮点数常数或变量。
注意Go 语言中并没有 “分数” 数据类型。虽然 “4/5” 看起来好像是一个分数实际上这是一个整数表达式整数 4 除以 整数 5。
【例程 4】分数有理数计算式接受的数据类型
// Example 4: Accepted data type in operation of fractional rational numbersimport reflectvar brat1 bigrat 4/5r
var brat2 bigrat (1r100 - 1) / 12345
var brat3 bigrat (1r100 - 1) / (5r36 1)
println reflect.TypeOf(brat1), , brat1 : , brat1
println reflect.TypeOf(brat2), , brat2 : , brat2
println reflect.TypeOf(brat3), , brat3 : , brat3brat4 : brat1 1024
brat5 : brat1 4/5
brat6 : brat1 1r65
brat7 : brat1 306/1025r
brat8 : brat1 brat2println reflect.TypeOf(brat4), , brat4 : , brat4
println reflect.TypeOf(brat5), , brat5 : , brat5
println reflect.TypeOf(brat6), , brat6 : , brat6
println reflect.TypeOf(brat7), , brat7 : , brat7
println reflect.TypeOf(brat8), , brat8 : , brat8/*
builtin.Gop_bigrat , brat1 : 4/5
builtin.Gop_bigrat , brat2 : 84510040015215293433113547025/823
builtin.Gop_bigrat , brat3 : 422550200076076467165567735125/114532461227
builtin.Gop_bigrat , brat4 : 5124/5
builtin.Gop_bigrat , brat5 : 4/5
builtin.Gop_bigrat , brat6 : 184467440737095516164/5
builtin.Gop_bigrat , brat7 : 1126/1025
builtin.Gop_bigrat , brat8 : 422550200076076467165567738417/4115
*/【例程 5】分数有理数运算不接受的数据类型
// Example 5: Unaccepted data type in operation of fractional rational numbersimport reflectvar xint int 1024
var ybint bigint 1r 65
var brat1 bigrat 1024 / (5r 36)brat4 : brat1 0.8 // 报错
//invalid operation: brat1 0.8 (mismatched types github.com/goplus/gop/builtin.Gop_bigrat and untyped float)brat5 : xint 320/7027r // 报错
//invalid operation: xint 320/7027r (mismatched types int and github.com/goplus/gop/builtin.Gop_untyped_bigrat)var brat6 bigrat ybint 320/7027r // 报错
//panic: gox.fatalMsg(dont call End(), please use EndInit() instead) [recovered]brat7 : ybint 320/7027r // 这句没有报错但不推荐使用
println reflect.TypeOf(brat7), , brat7 : , brat7 // 这句报错
//panic: TODO: cant init bigint from bigrat程序说明
1分数型有理数的运算表达式不允许使用浮点数常数或变量如 brat4 的运算式是错误的。 2分数型有理数的运算表达式不允许整型变量与分数分数型有理数运算如 brat5 的运算式是错误的。 3分数型有理数变量申明时使用表达式赋值不允许使用整型有理数变量如 brat6 是错误的。 4在分数型有理数的运算表达式中使用整型有理数变量与分数型有理数常数进行运算虽然没有直接报错但计算结果是不合法的因此也要避免使用。
说明关于分数型有理数的数据类型有些地方容易混淆下文将进行进一步的分析。 3.2 分数型有理数的四则运算
分数型有理数的基本运算如加减乘除其计算方法和规则与通常的四则运算相同运算结果表示为通分化简的分数型有理数。
【例程 6】分数型有理数的基本运算
// Example 6: : Basic operations with constants of rational numbers
import reflectvar brat1 bigrat 4/5r
var brat2 bigrat (1r100 - 1) / 12345
var brat3 bigrat (1r100 - 1) / (5r36 1)println brat1 brat2 , brat1brat2
println brat1 - brat2 , brat1-brat2
println brat1 * brat2 , brat1*brat2
println brat1 / brat2 , brat1/brat2println brat1 brat2 / brat3 , brat1brat2/brat3
println (brat1 brat2) / brat3 , (brat1brat2)/brat3
println brat1 (brat2 / brat3) , brat1(brat2/brat3)/* Running results
brat1 brat2 422550200076076467165567738417/4115
brat1 - brat2 -422550200076076467165567731833/4115
brat1 * brat2 67608032012172234746490837620/823
brat1 / brat2 3292/422550200076076467165567735125
brat1 brat2 / brat3 114532464519/4115
(brat1 brat2) / brat3 48395714406674320425927525589687130857659/1738794073313054662386311230039375
brat1 (brat2 / brat3) 114532464519/4115
*/程序说明
1分数型有理数的基本运算如加减乘除其计算方法和规则与通常的四则运算相同运算结果表示为通分化简的分数型有理数。 2分数型有理数的基本运算按照先乘除、后加减的顺序进行运算。 3分数型有理数运算式的运算结果表示为通分化简的分数型有理数。 3.3 分数型有理数变量与整型变量的混合运算
Go 语言中分数型有理数变量可以与整型变量进行混合运算运算结果为分数有理数分数型有理数不能与整型有理数进行混合运算。
【例程 7】分数型有理数变量与整型变量的运算
// Example 7: Mixed operation of fractional rational number variable and integer variable
var xint int 1024
var ybint bigint 1r 36var brat1 bigrat 4/5r
var brat2 bigrat (1r100 - 1) / 12345
var brat3 bigrat (1r100 - 1) / (5r36 1)println brat1xint // brat1 xint 5124/5
println brat2-2*xint // brat2 - 2*x 84510040015215293433111861521/823
println brat1*xint // brat1 * xint 4096/5
println brat2/xint // brat2 /xint 84510040015215293433113547025/842752println brat1ybint // 错误invalid operation
println brat2-2*ybint // 错误invalid operation
println brat1*ybint // 错误invalid operation
println brat2/2*ybint // 错误invalid operation程序说明
1分数型有理数变量可以与整型变量进行混合运算运算结果为分数有理数。 2分数型有理数不能与整型有理数进行混合运算——这一点有些意外也需要特别注意。 3.4 分数型有理数常量与整型变量的混合运算
分数型有理数常量与整型变量、整型有理数变量进行混合运算往往容易发生类型错误建议尽量避免。
【例程 8】整型有理数与浮点数的运算
// Example 8: Mixed operation of fractional rational number constant and integer variablevar xint int 1024
var ybint bigint 1r 36
var brat1 bigrat 4/12345rprintln brat1xint320/7027r //3978508/86748315
println xint320/7027r //错误invalid operation: xint320/7027rprintln brat1-ybint320/7027r //错误invalid operation: brat1-ybint
println ybint320/7027r //错误panic: TODO: cant init bigint from bigrat3.5 分数型有理数常量与整型常量的混合运算
分数型有理数常量可以与整型常量、整型有理数常量进行混合运算运算结果为分数型有理数。
一般来说分数型有理数常量不能与浮点数常量进行混合运算特殊情况如果浮点数的值是整数可以自动转换为整型可以运算但鉴于这种混合运算很容易发生类型错误建议尽量避免。
【例程 9】整型有理数与浮点数的运算
// Example 9: Mixed operation of fractional rational number constant and integer constantprintln 320/7027r1024 // 7195968/7027
println 320/7027r*1024/5 // 65536/7027
println 320/7027r*1024/5.0 // 65536/7027
//println 320/7027r*1024/5.5 // 错误invalid operation: 320/7027r*1024/5.5println 320/7027r1024r // 7195968/7027
println 320/7027r*1024r/5 // 65536/7027
println 320/7027r*1024r/5.0 // 65536/7027
//println 320/7027r*1024r/5.5 // 错误invalid operation: 320/7027r*1024r/5.5//println 320/7027r*(1r24)/5.0 // 1073741824/7027
//println 320/7027r*(1r24)/5.5 // 错误invalid operation: 320/7027r*(1r24)/5.5println 320/7027r1r24 // 117893497152/7027
println 320/7027r*(1r24) // 5368709120/7027
//println 320/7027r*1r24 // 错误invalid operation: 320/7027r*1r24println 320/7027r1r24/5 // 117893498432/35135
println 320/7027r1r(24/5) // 112752/7027
程序说明
1由于有理数常量的表示中带有 “r” 和 “” 符号要特别注意其前后运算符号、常数的结合关系、运算优先次序。例如320/7027r*(1r24)“可以正确运算而320/7027r*1r24” 发生错误。
2注意由于运算优先次序的不同320/7027r1r24/5与320/7027r1r(24/5)的结果不同。
因此对于整型有理数常数和分数型有理数常数推荐使用括号 “()” 将其与前后表达式进行隔离以减少出错。 4. 总结 Go 语言使用后缀 ‘r’ 表示有理数支持分数型有理数数据类型Rational number。 Go 语言允许在通过 var 声明变量时对变量赋值也允许不指定变量类型而直接对变量进行初始化并赋值这两种情况下都可以使用表达式对变量赋值。 Go 语言允许对分数型有理数变量只声明不赋值但系统并不自动为其设置初始值如果直接调用将发生错误因此推荐在对分数型有理数变量声明时赋初始值。 分数型有理数本质上是分子、分母均为整型有理数的数据结构。对分数型有理数变量赋值可以分子为整型数而分母为整型有理数或分子为整型有理数而分母为整型数或分子和分母都是整型有理数。 对分数型有理数变量赋值系统自动对表达式进行运算和通分化简。 分数型有理数变量可以与分数型有理数类型的常数或变量进行加减乘除运算也可以与整型常数、整型有理数常数进行混合运算不能与其它类型变量进行混合运算。 分数型有理数变量可以与整型变量进行混合运算运算结果为分数有理数分数型有理数不能与整型有理数进行混合运算。 分数型有理数常量可以与整型常量、整型有理数常量进行混合运算运算结果为分数型有理数。 由于有理数常量的表示中带有 “r” 和 “” 符号要特别注意其前后运算符号、常数的结合关系、运算优先次序。推荐使用括号 “()” 将其与前后表达式进行隔离以减少出错。
5. 附录出错的代码汇总
以下是本文中出现程序错误的代码供大家参考。
// 错误代码汇总var brat4 bigrat // 这句没有报错但不推荐使用brat4 : brat1 0.8 // 报错invalid operation
brat5 : xint 320/7027r // 报错invalid operation
brat6 : ybint 320/7027r // 这句没有报错但不推荐使用var brat6 bigrat ybint 320/7027r // 报错panicprintln brat1ybint // 错误invalid operation
println brat2-2*ybint // 错误invalid operation
println brat1*ybint // 错误invalid operation
println brat2/2*ybint // 错误invalid operationprintln xint320/7027r //错误invalid operation: xint320/7027r
println brat1-ybint320/7027r //错误invalid operation: brat1-ybint
println ybint320/7027r //错误panic: TODO: cant init bigint from bigratprintln 320/7027r*1024/5.5 // 错误invalid operation: 320/7027r*1024/5.5println 320/7027r*1024r/5.0 // 这句没有报错但不推荐使用
println 320/7027r*1024r/5.5 // 错误invalid operation: 320/7027r*1024r/5.5println 320/7027r*(1r24)/5.0 // 这句没有报错但不推荐使用
println 320/7027r*(1r24)/5.5 // 错误invalid operation: 320/7027r*(1r24)/5.5println 320/7027r*(1r24) // 正确5368709120/7027
println 320/7027r*1r24 // 错误invalid operation: 320/7027r*1r24 【本节完】 版权声明
原创作品转载必须标注原文链接(https://blog.csdn.net/youcans/article/details/121874187)
Copyright 2021 youcans, XUPT
Crated2021-12-10 欢迎关注『我的Go语言初体验』系列持续更新中… 我的Go语言初体验——1超详细安装教程 我的Go语言初体验——2 IDE 详细安装教程 我的Go语言初体验——3Go 数据类型 我的Go语言初体验——4零基础学习 Go 爬虫 我的Go语言初体验——5Go 基本语法之 Switch 我的Go语言初体验——6Go 整型有理数数据类型 我的Go语言初体验——7Go 分数型有理数数据类型 “我的Go语言初体验” | 征文活动进行中…