2017-09-03 32 views
4

Perl 6轉換到/從base4轉換時丟失精度。如何保持精度?perl6 precission base4轉換

'0.2322130120323232322110'.parse-base(4) 
--> perl6 output :   0.728295262649453 
--> high precission value: 0.728295262649453434278257191181182861328125 

問題是,轉換到0.728295262649453base(4),輸出是不是原來的數。

0.72829526264945.base(4) 
--> output: 0.232213012032323232210333 
--> original: 0.2322130120323232322110 

請解釋一下,如何在轉換後得到相同的值?

+0

浮點數只是_approximating_人類風格的十進制數,其和(負)冪的和爲2. –

+0

@JoopEggen:Perl 6不使用浮點數,除非您自己動手去尋找它們。 – piojo

+0

@piojo http://floating-point-gui.de/languages/perl/建議不然,我無法想象Perl 6由於內部仿真而在浮點運算上很慢。標量只是(如在Basic中)一樣。 –

回答

7

的問題可能是在您創建「perl6輸出」的方式:

say "0.2322130120323232322110".parse-base(4) # 0.72829526264945 

這是因爲say調用.gist方法上無論它被賦予。或者您試圖將其串聯(它呼叫.Str,這與.gist的結果相同)。如果你想呼籲結果.perl方法:

say "0.2322130120323232322110".parse-base(4).perl 

得到預期的0.728295262649453434278257191181182861328125.perl方法返回一個字符串,您可以使用EVAL來獲取最初給定的值。

在任何情況下,如果你這樣做:

say "0.2322130120323232322110".parse-base(4).base(4) 

,你會看到你找回原來的價值0.2322130120323232322110。我想這只是一個例子,而不是說它。 :-)

一個可以認爲.StrRat應該使用.perl而不是.gist。也許這應該是一個關注點:它可能會阻止你去問這個問題。