role Real does Numeric { ... }

Complex 数的通用角色。

方法§

方法 Bridge§

method Bridge(Real:D:)

默认实现强制将调用者转换为Num,这是核心Real类型中此方法的行为。此方法主要存在是为了让用户轻松实现自定义Real类型,其中Bridge方法返回最能表示自定义Real类型的核心Real类型(并非一定是Num)。反过来,这使所有核心运算符和方法都能获得可用的值,以便它们可以处理。

例如,我们可以实现自定义Temperature类型。它具有度量单位和值,它们在实例化期间给出。我们可以实现使用此类型的自定义运算符或转换方法。但是,当涉及到常规数学运算符时,我们可以简单地使用.Bridge方法将Temperature转换为以核心数字类型之一表示的开尔文

class Temperature is Real {
    has Str:D  $.unit  is required where any <K F C>;
    has Real:D $.value is required;
    method new ($value:$unit = 'K'{ self.bless :$value :$unit }
    # Note: implementing .new() that handles $value of type Temperature is left as an exercise 
 
    method Bridge {
        when $!unit eq 'F' { ($!value + 459.67) × 5/9 }
        when $!unit eq 'C' {  $!value + 273.15 }
        $!value
    }
    method gist { self.Str }
    method Str  { "$!value degrees $!unit" }
}
 
sub postfix:<> { Temperature.new: $^value:unit<C> }
sub postfix:<> { Temperature.new: $^value:unit<F> }
sub postfix:<K> { Temperature.new: $^value:unit<K> }
 
my $human := 36.6℃;
my $book  := 451℉;
my $sun   := 5778K;
say $human;                # OUTPUT: «36.6 degrees C␤» 
say $human + $book + $sun# OUTPUT: «6593.677777777778␤» 
say 123+ 456K;           # OUTPUT: «579␤»

从输出的最后两行可以看出,桥接结果的类型不必是任何特定核心类型。当我们使用Rat实例化Temperature或涉及转换时,它是一个Rat,当我们使用Int实例化Temperature时,它是一个Int

方法 Complex§

method Complex(Real:D: --> Complex:D)

将数字转换为Complex,其中数字转换为Num作为其实部,0e0作为虚部。

方法 Int§

method Int(Real:D:)

在调用者上调用Bridge方法,然后在返回值上调用Int方法

方法 Rat§

method Rat(Real:D: Real $epsilon = 1e-6)

在调用者上调用Bridge方法,然后在返回值上使用$epsilon参数调用Rat方法

方法 Real§

multi method Real(Real:D: --> Real:D)
multi method Real(Real:U: --> Real:D)

:D变体只是返回调用者。:U变体会发出有关在数字上下文中使用未初始化值并返回self.new的警告。

方法 Str§

multi method Str(Real:D:)

在调用者上调用Bridge 方法,然后在其返回值上调用Str 方法

方法 Num§

method Num(Real:D:)

在调用者上调用Bridge 方法,然后在其返回值上调用Num 方法

例程 rand§

sub term:<rand> (--> Num:D)
method rand(Real:D: --> Real:D)

返回介于零(包括)和数字(不包括)之间的伪随机数。Bridge 方法用于将Real强制转换为支持rand方法的数字。

术语形式返回介于 0e0(包括)和 1e0(不包括)之间的伪随机Num

方法 sign§

method sign(Real:D:)

如果数字为负,则返回-1;如果为零,则返回0;否则返回1

方法 round§

method round(Real:D: $scale = 1)

将数字舍入到比例$scale。如果$scale为 1,则舍入为整数。如果比例为0.1,则舍入到小数点(句号或逗号)后一位,依此类推。

方法 floor§

method floor(Real:D: --> Int:D)

返回不大于该数字的最大整数。

方法 ceiling§

method ceiling(Real:D: --> Int:D)

返回不小于该数字的最小整数。

方法 truncate§

method truncate(Real:D: --> Int:D)

将数字朝零舍入。

方法 polymod§

method polymod(Real:D: +@mods)

返回在@mods参数中顺序应用所有除数后的余数;数组的最后一个元素将是最后一个余数。

say (1e8+1).polymod(10 xx 8);  # OUTPUT: «(1 0 0 0 0 0 0 0 1)␤»

10 xx 8只是一个包含八个数字 10 的数组;第一个除以 10 的结果将返回1作为余数,而其余结果(直到最后一个)将返回 0。如上所述,对于 8 个除数,结果将多一个元素,在这种情况下是最后一个余数。

say ⅔.polymod(⅓);                            # OUTPUT: «(0 2)␤» 
say 5.Rat.polymod(.3.2);                   # OUTPUT: «(0.2 0 80)␤»

方法 base§

method base(Real:D: Int:D $base where 2..36$digits? --> Str:D)

使用$base作为基数将数字转换为字符串。对于大于十的$base,使用大写拉丁字母。

255.base(16);            # 'FF'

可选的$digits参数要求小数的位数(不能为负)。如果省略,则根据类型选择合理的默认值。对于 Int,此默认值为 0。对于Num,默认值为 8。对于Rational,位数根据分母的大小进行缩放,最小为 6。

可以将Whatever (*) 的特殊值指定为$digits,其功能与未为所有Real类型(Rationals 除外)指定$digits时相同。对于Rationals,Whatever表示您希望小数部分的所有可能位数,但请小心:由于无法检测到重复的小数部分(算法最终将在生成 2**63 位后停止)。

产生的最后一位始终是四舍五入的。

say pi.base(103);      # OUTPUT: «3.142␤» 
say (1/128).base(10*); # OUTPUT: «0.0078125␤» 
say (1/100).base(10*); # OUTPUT: «0.01␤» 
say (1/3)  .base(10*); # WRONG: endlessly repeating fractional part

有关反向操作,请参阅 parse-base

Typegraph§

Real 的类型关系
raku-type-graph Real Real Numeric Numeric Real->Numeric Mu Mu Any Any Any->Mu Cool Cool Cool->Any Num Num Num->Real Num->Cool Instant Instant Instant->Real Instant->Cool Duration Duration Duration->Real Duration->Cool Rational Rational Rational->Real Int Int Int->Real Int->Cool Stringy Stringy Str Str Str->Cool Str->Stringy Allomorph Allomorph Allomorph->Str NumStr NumStr NumStr->Num NumStr->Allomorph atomicint atomicint atomicint->Int Bool Bool Bool->Int IntStr IntStr IntStr->Int IntStr->Allomorph Order Order Order->Int Signal Signal Signal->Int int int int->Int Endian Endian Endian->Int PromiseStatus PromiseStatus PromiseStatus->Int FatRat FatRat FatRat->Cool FatRat->Rational Rat Rat Rat->Cool Rat->Rational

展开上面的图表