2017-11-28 6 views
3

Perl6のlog関数がRat型ではなくNum型を返す理由を知っている人はいないでしょうか。Perl6ログメソッドは、Numではないラットを返す

say (e*e).log.WHAT; 
> (Num) 
say (2/3).WHAT; 
> (Rat) 
+0

P6は上記で象徴的な計算をしていません。 'e'は*不合理な*番号です。 'Num'はダブルフロートです。 「ラット」は合理的です。私はこれが有用な情報であるとは思わないが、それは短い。 :) – raiph

答えて

5

これは誰もまだ何か他のことをするための作業をしていないからです。言語が処理できる状況(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 
6

数学では、Logは連続関数なので、数学的に真の値を持ちます。 Numタイプは、Perl 6の数学的に実数を表します。Ratタイプは、数学的に有理数を表します。

+0

'Num'は浮動小数点数です。 「リアル」の役割は、数学的に真の値をよりよく表す。 「Int」、「Rat」、「Num」はすべて「本当」の役割を果たします。 'Numeric'ロールは' Real'が行う全ての型をカプセル化し、 'Complex'型の型を追加します。 – Joshua

4

Perl6のは、数式処理システムではないので、それは他のどのNumようe*e扱います - あなたは浮動小数点数を持っていると、そのような丸めなどの明示的な操作がIntまたはRatのようなものにタイプを変更する必要があります。戻り値2e0(e*e).logの場合は、実際には2、またはそれに相当するものが2+εであるかどうかをコンピュータは認識できません。

関連する問題