楽の有理数


8

Rakuは数値型が優れているため、いくつかの計算に使用しています。ただし、「。raku」の使用に問題があります

say (1/6+1/6).raku
#<1/3>

これを手に入れます。しかしながら、

say (1/10+1/10).raku
#0.2

バグですか?<1/5>を期待していました。何が起こるのですか?


これはPerlプログラミング言語に関係しないため、perlタグを削除しました。
池上

回答:


11

Rakuでは、を0.2作成しRat、書き込み1/5(定数の折りたたみ)または<1/5>(リテラル形式)とまったく同じ結果を生成します。指数を指定した場合にのみ浮動小数点を取得します(たとえば、2e-1)。

.raku(旧として知られている.perl方法の仕事)場合は、同じ値をラウンドトリップして生成されます何か作ることであるEVALD「を。の場合1/5、それは10進数として正確に表すことができるため、が生成され0.2ます。小数形式が往復しない場合にのみ、小数表現に頼ります。

.numerator.denominatorメソッドを使用して、いつでも分子と分母を希望どおりにフォーマットできます。さらに、.nudeメソッドは分子と分母のリストを返します。/必要に応じて、それらをaと結合できます。

say (1/6+1/6).nude.join("/");     # 1/3
say (1/10+1/10).nude.join("/");   # 1/5

.nude意図せずおかしいメソッド名
user0721090601

1
意図的ではないと誰が言ったのですか?
Holli

1
@ user0721090601ラリーがインタビューでそれをどのように述べたかに基づいて、私はそれが意図的であると確信しています。
Brad Gilbert

@BradGilbert私はコメントをしたときに誰かがそれを言ってポップインするだろうと思っていました:-)
user0721090601

1

こんにちは@ milou123私はまた、rakuが10進数表現に戻ることに少し驚いていました。たとえば、分数演算を教えるなどの一部のコンテキストは、「キープラット」モードを使用するとメリットがあることがわかります。そうは言っても、最終的には.rakuを実行する方法は1つしかなく、10進数がデフォルトの表現であることは理にかなっています。

もちろん、rakuでは、少しだけ言語を変更することもできます。この場合、私は新しい「→」後置演算子を発明しました...

multi postfix:<→> ( Rat:D $r ) { $r.nude.join("/") }
say (1/5+1/5)→;    # 2/5

組み込みの「raku」メソッドを同様の方法でオーバーライドできるかどうかを考え出すには、私は賢くありません。簡潔に行う方法についてのアドバイスを楽しみにしています...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.