Perl6のlog関数がRat型ではなくNum型を返す理由を知っている人はいないでしょうか。Perl6ログメソッドは、Numではないラットを返す
say (e*e).log.WHAT;
> (Num)
say (2/3).WHAT;
> (Rat)
Perl6のlog関数がRat型ではなくNum型を返す理由を知っている人はいないでしょうか。Perl6ログメソッドは、Numではないラットを返す
say (e*e).log.WHAT;
> (Num)
say (2/3).WHAT;
> (Rat)
これは誰もまだ何か他のことをするための作業をしていないからです。言語が処理できる状況(Perl 6では特別ではない)ですが、それを処理したくない状況もあります。
自然塩基であるe
を表すオブジェクトはありません。それ以上はできなくなるまで維持します(Rat
は、そうでなければNum
になりません)。それは可能であり、私たちにそれをどのように扱うかを決めることも可能になります。たぶん、Rat
、またはFatRat
、あるいはNum
の小数点以下の特定の桁数が必要なのかもしれません。しかし、それはしません。
でも、e
は特別です。それは、どちらかの10のべき乗では動作しません:
> 100.log10
2
> 100.log10.^name
Num
.log10
の背後にあるコードは、オペランドは10の力であることを確認し、その場合にはInt
を返すように決めることができました。しかし、それはすべての数字をチェックする必要があり、ほとんどの数字は10の累乗ではありません。それらのすべてをチェックすると、プロセスが遅くなります。少し「間違っている」方が簡単です。
しかし、あなたはおそらくより制約のタイプを取得するために.narrow
を使用することができます。
> (10/3).Int
3
> (10/3).narrow.^name
Rat
と楽しみのために:
> 100.log10.narrow.^name
Int
これは、特定のタイプを尋ねると、おそらく別の番号を取得して異なっています:
> i*i
-1+0i
> (i*i).^name
Complex
> (i*i).narrow.^name
Int
数学では、Logは連続関数なので、数学的に真の値を持ちます。 Num
タイプは、Perl 6の数学的に実数を表します。Rat
タイプは、数学的に有理数を表します。
'Num'は浮動小数点数です。 「リアル」の役割は、数学的に真の値をよりよく表す。 「Int」、「Rat」、「Num」はすべて「本当」の役割を果たします。 'Numeric'ロールは' Real'が行う全ての型をカプセル化し、 'Complex'型の型を追加します。 – Joshua
Perl6のは、数式処理システムではないので、それは他のどのNum
ようe*e
扱います - あなたは浮動小数点数を持っていると、そのような丸めなどの明示的な操作がInt
またはRat
のようなものにタイプを変更する必要があります。戻り値2e0
が(e*e).log
の場合は、実際には2
、またはそれに相当するものが2+ε
であるかどうかをコンピュータは認識できません。
P6は上記で象徴的な計算をしていません。 'e'は*不合理な*番号です。 'Num'はダブルフロートです。 「ラット」は合理的です。私はこれが有用な情報であるとは思わないが、それは短い。 :) – raiph