Perl 6 数值类型: Numbers

数值的分类(初高中知识)

《Perl 6 数值类型: Numbers》 数值的分类| 用Sketch画的

数值可以分为“实数(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_0020002_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角色,继承所有方法

Reference

  1. Backup: Numbers in Perl6
点赞