does Numeric
非Complex
数的通用角色。
方法§
方法 Bridge§
method Bridge(Real:)
默认实现强制将调用者转换为Num
,这是核心Real
类型中此方法的行为。此方法主要存在是为了让用户轻松实现自定义Real
类型,其中Bridge
方法返回最能表示自定义Real
类型的核心Real
类型(并非一定是Num
)。反过来,这使所有核心运算符和方法都能获得可用的值,以便它们可以处理。
例如,我们可以实现自定义Temperature
类型。它具有度量单位和值,它们在实例化期间给出。我们可以实现使用此类型的自定义运算符或转换方法。但是,当涉及到常规数学运算符时,我们可以简单地使用.Bridge
方法将Temperature
转换为以核心数字类型之一表示的开尔文
is Realsub postfix:<℃>sub postfix:<℉>sub postfix:<K>my := 36.6℃;my := 451℉;my := 5778K;say ; # OUTPUT: «36.6 degrees C»say + + ; # OUTPUT: «6593.677777777778»say 123K + 456K; # OUTPUT: «579»
从输出的最后两行可以看出,桥接结果的类型不必是任何特定核心类型。当我们使用Rat
实例化Temperature
或涉及转换时,它是一个Rat
,当我们使用Int
实例化Temperature
时,它是一个Int
。
方法 Complex§
method Complex(Real: --> Complex)
将数字转换为Complex
,其中数字转换为Num
作为其实部,0e0作为虚部。
方法 Int§
method Int(Real:)
在调用者上调用Bridge
方法,然后在返回值上调用Int
方法。
方法 Rat§
method Rat(Real: Real = 1e-6)
在调用者上调用Bridge
方法,然后在返回值上使用$epsilon
参数调用Rat
方法。
方法 Real§
multi method Real(Real: --> Real)multi method Real(Real: --> Real)
:D
变体只是返回调用者。:U
变体会发出有关在数字上下文中使用未初始化值并返回self.new
的警告。
方法 Str§
multi method Str(Real:)
在调用者上调用Bridge
方法,然后在其返回值上调用Str
方法。
方法 Num§
method Num(Real:)
在调用者上调用Bridge
方法,然后在其返回值上调用Num
方法。
例程 rand§
sub term:<rand> (--> Num)method rand(Real: --> Real)
返回介于零(包括)和数字(不包括)之间的伪随机数。Bridge
方法用于将Real
强制转换为支持rand方法的数字。
术语形式返回介于 0e0(包括)和 1e0(不包括)之间的伪随机Num
。
方法 sign§
method sign(Real:)
如果数字为负,则返回-1
;如果为零,则返回0
;否则返回1
。
方法 round§
method round(Real: = 1)
将数字舍入到比例$scale
。如果$scale
为 1,则舍入为整数。如果比例为0.1
,则舍入到小数点(句号或逗号)后一位,依此类推。
方法 floor§
method floor(Real: --> Int)
返回不大于该数字的最大整数。
方法 ceiling§
method ceiling(Real: --> Int)
返回不小于该数字的最小整数。
方法 truncate§
method truncate(Real: --> Int)
将数字朝零舍入。
方法 polymod§
method polymod(Real: +)
返回在@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: Int where 2..36, ? --> Str)
使用$base
作为基数将数字转换为字符串。对于大于十的$base
,使用大写拉丁字母。
255.base(16); # 'FF'
可选的$digits
参数要求小数的位数(不能为负)。如果省略,则根据类型选择合理的默认值。对于 Int,此默认值为 0。对于Num
,默认值为 8。对于Rational
,位数根据分母的大小进行缩放,最小为 6。
可以将Whatever
(*
) 的特殊值指定为$digits
,其功能与未为所有Real
类型(Rational
s 除外)指定$digits
时相同。对于Rational
s,Whatever
表示您希望小数部分的所有可能位数,但请小心:由于无法检测到重复的小数部分(算法最终将在生成 2**63 位后停止)。
产生的最后一位始终是四舍五入的。
say pi.base(10, 3); # 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