Lar*_*een 10 rational-number sequence significant-digits raku
我写了一个简单的代码:
\nsub euler-ex ($x) of Seq {\n   1, { $x**++$ / [\xc3\x97] 1 .. ++$ } ... Inf }\nsay " 5: " ~ euler-ex(5)[^20]  ~ " = " ~ [+](euler-ex(5)[^20]);\n输出:
\n5: 1 5 12.5 20.833333 26.041667 26.041667 21.701389 15.500992 9.68812 5.382289 2.6911445 1.22324748 0.50968645 0.19603325 0.07001187499 0.023337291662 0.0072929036444 0.00214497166011 0.000595825461143 0.000156796173985 = 148.41310786833832\n如何指定该输出的位数,即来自序列的显式生成器的小数位数?
\nCok*_*oke 10
您可以将最后一行更改为
say " 5: " ~ euler-ex(5)[^20].fmt("%0.10f")  ~ "=" ~ [+](euler-ex(5)[^20]).fmt("%0.10f");
并得到像这样的输出
 5: 1.0000000000 5.0000000000 12.5000000000 20.8333333333 26.0416666667 26.0416666667 21.7013888889 15.5009920635 9.6881200397 5.3822889109 2.6911444555 1.2232474798 0.5096864499 0.1960332500 0.0700118750 0.0233372917 0.0072929036 0.0021449717 0.0005958255 0.0001567962=148.4131078683
您可能有兴趣知道该序列正在生成Rats,因此您可以根据需要获得准确的值。您可以使用以下命令查看“原始”值
dd euler-ex(5)[^20];
(1, 5.0, 12.5, <125/6>, <625/24>, <625/24>, <3125/144>, <15625/1008>, <78125/8064>, <390625/72576>, <390625/145152>, <1953125/1596672>, <9765625/19160064>, <48828125/249080832>, <244140625/3487131648>, <244140625/10461394944>, <1220703125/167382319104>, <6103515625/2845499424768>, <30517578125/51218989645824>, <152587890625/973160803270656>)
您可以将round数字调整为所需的比例:
>>> 12.8471 .round(0.01)\n12.85\n12.8471 四舍五入到最接近的 0.01 倍数;有效,保留 2 位小数。
\n你有一个数字序列,所以map有:
>>> (1, * +  ... *) .head(5)\n(1 3.718281828459045 6.43656365691809 9.154845485377136 11.87312731383618)\n\n>>> (1, * +  ... *) .map(*.round(0.01)) .head(5)\n(1 3.72 6.44 9.15 11.87)\n因此,例如,对于 2 位小数,需要 0.01 == 10 ** -2;然后我们可以将其论证给函数:
\nsub euler-ex($x, Int :$digits) of Seq {\n   my $seq := 1, { $x ** ++$ / [\xc3\x97] 1 .. ++$ } ... Inf;\n   $digits\n       ?? $seq.map(*.round(10 ** -$digits))\n       !! $seq\n}\n\n>>> euler-ex(5).head(6)\n(1 5 12.5 20.833333 26.041667 26.041667)\n\n>>> euler-ex(5, :3digits).head(6)\n(1 5 12.5 20.833 26.042 26.042)\n如果$digits提供(并且非零...),则序列将返回,其计算值四舍五入到小数点后的位数。否则,照原样。
注意round返回一个数值(例如上面的 Rational),并且12.3. round(0.01)会给出12.3not 12.30,即不放置尾随零。如果需要的话,.fmt作为另一个答案(但在map; 或sprintf)是可能的(注意它们给出字符串)。