数值的分类(初高中知识)
数值可以分为“实数(Real Number)”和“虚数(Imaginary Number)”,实数又分为“有理数(Rational Number)”和“无理数(Irrational Number)”,有理数又可以分为“整数(Integer)”和“小数(Decimal)”,整数又可以分为“正数(Positive Integer)”,“负数(Negative Integer)”和0。
绿色的是 role(角色), 橘黄色的是 class(类)
就是这么简单明了
Perl 6 中的数值类型
Perl6 提供的数字类型概全了整个数字的各个分类,
- 角色:
Numeric
,Real
,Rational
- 类:
Complex
,Num
,Rat
,FatRat
,Int
- 类:
ComplexStr
,NumStr
,RatStr
,IntStr
数值纯种:Complex/Num/Rat/FatRat/Int
-
Complex
是“虚数”,或者称为“复数” -
Num
是“实数” -
Rat
是“有理数” -
Int
是“整数”
这些基础类型都 immutable(不可更改的)
Complex
# 虚数
a+bi #用 i 来表示虚位
COMPLEX.re #返回实部
COMPLEX.im #返回虚部
COMPLEX.reals #返回实部虚部 List
COMPLEX.polar #返回极坐标系的实部虚部 List
####
.floor
.ceiling
.round
.truncate #truncate 去掉小数部分,只保留整数
####
COMPLEX.abs # sqrt(($z.re)² + ($z.im)²)
COMPLEX.conj # 例如 1-4i 返回 1+4i
####
.gist .perl
Num
- is Cool does Real(Cool的方法以及Real方法都可以用)
- 双精度的数值
Int
整数类型是我们日常中最常用的,
- 和Perl5一样,数字之间的下划线都会被忽略的,例如
2_0_00
和2000
和2_000
一样:不论进制,都可以用下划线分
# 十六进制
:16<BEFF>
0xBEFF # Perl 5/Python中的表示方式
# 八进制
:8<377>
0o377 # Perl 5/Python中的表示方式
# 二进制
:2<11111111>
0b121111111 # Perl 5/Python中的表示方式
#不论进制,都可以用下划线分
###########
INT.chr
INT.unival
# 指数之后取余数 (INT ^ POWER) % MODULUS
INT.expmod(POWER,MODULUS)
# 分别递次取余数,
# LIST 中的第一个取余之后的商,作为第二次的被除数,依次...
# 可以方便地把秒 转换成 年月天时分秒
INT.polymod(LIST)
#不止可以是 Int,Rat,Real也可以这个方法
# 是不是质数
INT.is-prime
#返回数字的二进制形式最右端(lower)为1的index
INT.lsb
#返回数字的二进制形式最左端(higher)为1的index
INT.msb
###### 从Real角色继承的方法
# from role Real
.Rat #转成有理数类型
.rand
.sign
# 近似化取值
.round
.floor
.ceiling
.truncate
#转换进制:$n进制,$digit小数位
# $n 必须在2到36, 返回字符串
#因为数字加字母总共就10+26=36位,不然无法表示了
INT.base($n,$digit)
Rat
- is Cool does Rational(Cool的方法以及Rational的方法都可以用)
- 默认的小数都是Rat类型
- 写出来的有小数点的数都是有理数,因为你不可能写出带点的无理数来。默认都是 Rat 类型
FatRat
相比Rat
类,FatRat肥在精度保留
# 构造器
FatRat.new($numerator,$denominator)
# 整型得到FatRat类型
INT.FatRat
# Rat型得到FatRat类型
RAT.FatRat
# 分子
$z.numeritor
# 分母
$z.denominator
# 分子、分母 List
$z.nude
# 约分到最小
$z.norm
#公约数只有1的两个整数/自然数,叫做互质 coprime
# 分式转换成小数
$z.base-repeating($base)
#返回一个 list of 2 Str类型的,分别是小数的`整数部分`,和`小数部分`。如果除不尽,保留 $base 位
数值杂种: 数字字符串杂合体
就是某个类型的数字和 Str 的杂合体,都是*Str (ComplexStr, NumStr, RatStr, IntStr)这样的表示方式。
- 用作数字的时候是数值,用作字符串的时候是
Str
。 - 都必须
*Str.new($i, $s)
这样定义。第一个参数是对应的数值,第二个是字符串。-
$i
是对应的数字类型 -
$s
*是一个字符串类型的 -
$i
,$s
都是必须指定的
-
- 对应的*Str 类型的是字符串和对应数值类型 bless 到一起的,由两部分组成,可以分别提取这两部分。
ComplexStr
- is Complex is Str()
- 把它当 Complex 用时,它会调用.Numeric方法返回数字部分,把它当字符串用时,它就返回字符串的部分。所有的*Str 类型的数字字符串杂种都一样。
$z = ComplexStr.new($i, $s)
$z.Numeric #当你把 ComplexStr 类型的时候,调用
$z.Complex #返回数字部分
$z.Str #返回字符串部分
$z1 cmp $z2 #True 如果$i,$s 的顺序和值都一样
NumStr
$n = NumStr.new($i,$s)
$n.Num
$n.Str
$n.Numeric #默认在数字环境下调用
$n1 cmp $n2 #先比对$i.再$s
RatStr
$r = RatStr.new($i,$s)
$r.Rat
$r.Str
$r.Numeric
$r1 cmp $r2
IntStr
$i = Int.new($i,$s)
$i.Int
$i.Str
$i.Numeric
$i1 cmp $i2
数值角色 role
Numeric角色
# 转换成兼容的其他数值类型
.Real
.Int
.Rat
.Num
#自动把数字转换成最小的能容纳的类型
.narrow
# Log方法
.log
.log10
# 指数方法
#默认base是e,如果不指定的话
NUM.exp($base)
# 取根号
NUM.roots($n)
# 绝对值,开平方,
.abs
.sqrt
.conj
# 强大的自加自减,可以自加自减数字、字母等
.succ
.pred
# Str类也有这个方法,自加自减,但不局限与数字
#对于命名太方便了
Real角色
# 把 Real 类型转成 Rat 类型, $epsilon 定义精度
.Rat($epsilon)
# 近似化数值
.rand
.sign
.round
.floor
.ceiling
.truncate
# 进制转换
.base($base, $digits) #各种进制的转换
Rational角色
Rational.new($n,$d)
.numerator
.denominator
.nude
.norm
.bash-repeating($base)
#FatRat扮演Rational角色,继承所有方法