2017-09-03 17 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。也许这应该是一个关注点:它可能会阻止你去问这个问题。