我怎样才能让这款 raku Muller Recurrence One-Liner 发挥作用?
How can I get this raku Muller Recurrence One-Liner to work?
在对我最近 blog post 的回复中,Markus H. 回复了一个非常简洁的替代代码,即:
dd $_ for (4, 4.25, 108 – (815 – 1500 / * ) / * … *)[^30].kv
遗憾的是我无法让它“开箱即用”并得到这个错误:
Confused
at /Users/stephenroe/Dropbox/RakuStuff/mullerrec/./mullerrec3.raku:27
------> dd $_ for (4, 4.25, 108⏏ – (815 – 1500 / * ) / * … *)[^30].kv
expecting any of:
infix
infix stopper
statement end
statement modifier
statement modifier loop
我该如何解决这个问题?
这是我可以开始工作的代码(是的,我的风格有点不同,但没关系):
sub f(\y,\z) {
108 - ( (815 - 1500/z ) / y )
}
dd $_ for (4, 4.25, -> \z,\y {f(y,z)} … ∞)[^30].kv;
作为后续,我想我需要将参数交换到 f,但 Markus 没有这样做,谁是对的?我很想知道这是否是一个陷阱,然后问题是“我怎样才能颠倒消耗任何星星的顺序”?
或者类似的东西:
dd $_ for (4, 4.25, f(^z,^y) … ∞)[^30].kv; #not legal
TL;DR Cut/paste 在非 Unicode 字符集时代充满了无可救药的烦恼,而且情况越来越糟——但至少它通常是 大声 焦躁不安,所以有人得到了 mojibake,很明显事情出了问题。在 Unicode 时代,这是一个新的游戏。你需要 s/–/-/
.
进行了更改,但也进行了一些其他更改以切换到希望更有洞察力的显示,并切换到 FatRat
计算,因此结果 100% 准确 无限精度:
say sprintf "%-2s: %-24s %s / %s", .key, .value, |.value.nude
for (4.FatRat, 4.25, 108 - (815 - 1500 / * ) / * … *)[^30].pairs
0 : 4 4 / 1
1 : 4.25 17 / 4
2 : 4.470588 76 / 17
3 : 4.644737 353 / 76
4 : 4.770538 1684 / 353
5 : 4.855701 8177 / 1684
6 : 4.910847 40156 / 8177
7 : 4.945537 198593 / 40156
8 : 4.96696258 986404 / 198593
9 : 4.9800457 4912337 / 986404
10: 4.987979448 24502636 / 4912337
11: 4.9927702881 122336033 / 24502636
12: 4.99565589151 611148724 / 122336033
13: 4.99739126838 3054149297 / 611148724
14: 4.998433943945 15265963516 / 3054149297
15: 4.9990600719709 76315468673 / 15265963516
16: 4.9994359371468 381534296644 / 76315468673
17: 4.99966152410377 1907542343057 / 381534296644
18: 4.999796900713418 9537324294796 / 1907542343057
19: 4.999878135477931 47685459212513 / 9537324294796
20: 4.9999268795045999 238423809278164 / 47685459212513
21: 4.99995612706115774 1192108586037617 / 238423809278164
22: 4.999973676005712445 5960511549128476 / 1192108586037617
23: 4.999984205520272708 29802463602463553 / 5960511549128476
24: 4.9999905232822276594 149012035582781284 / 29802463602463553
25: 4.99999431395855959365 745059330625296977 / 149012035582781284
26: 4.99999658837125602371 3725294111260656556 / 745059330625296977
27: 4.999997953021356907988 18626462930705797793 / 3725294111260656556
28: 4.9999987718123113299994 93132291776736534004 / 18626462930705797793
29: 4.9999992630872057845553 465661390253305305137 / 93132291776736534004
Muller's Recurrence 是一个近似值。但是给定迭代的 accuracy/precision 是由先前迭代的 accuracy/precision 决定的。这些又受到所用数字类型和操作的 accuracy/precision 的影响:
使用浮点数/运算在第 12 次左右的迭代后产生无用的结果。
只要数字保持在其精度范围内,使用定点数字/运算就会产生准确的结果,然后很快就会产生无用的结果。
在我的@Holli 代码变体中,我使用了 Raku 的 FatRat
数字类型和操作。这保持了 100% 的准确性和无限的精度。即使是廉价的硬件也可以在不到一秒的时间内轻松完成 1,000 次迭代,准确率为 100%。
穆勒的递推公式在数学上只涉及有理数和运算(“有理数”包括整数)。 Raku 中的数字运算方便地遵循 rules of "infection" 这样 if:
每次迭代中至少有一个是FatRat
;
None的数字是Num
(浮点数);
没有运算引入了一个Num
(浮点数);
然后每次迭代都会产生另一个 100% 准确的结果 FatRat
。
如果将其中一个数字强制转换为 FatRat
。
在对我最近 blog post 的回复中,Markus H. 回复了一个非常简洁的替代代码,即:
dd $_ for (4, 4.25, 108 – (815 – 1500 / * ) / * … *)[^30].kv
遗憾的是我无法让它“开箱即用”并得到这个错误:
Confused
at /Users/stephenroe/Dropbox/RakuStuff/mullerrec/./mullerrec3.raku:27
------> dd $_ for (4, 4.25, 108⏏ – (815 – 1500 / * ) / * … *)[^30].kv
expecting any of:
infix
infix stopper
statement end
statement modifier
statement modifier loop
我该如何解决这个问题?
这是我可以开始工作的代码(是的,我的风格有点不同,但没关系):
sub f(\y,\z) {
108 - ( (815 - 1500/z ) / y )
}
dd $_ for (4, 4.25, -> \z,\y {f(y,z)} … ∞)[^30].kv;
作为后续,我想我需要将参数交换到 f,但 Markus 没有这样做,谁是对的?我很想知道这是否是一个陷阱,然后问题是“我怎样才能颠倒消耗任何星星的顺序”?
或者类似的东西:
dd $_ for (4, 4.25, f(^z,^y) … ∞)[^30].kv; #not legal
TL;DR Cut/paste 在非 Unicode 字符集时代充满了无可救药的烦恼,而且情况越来越糟——但至少它通常是 大声 焦躁不安,所以有人得到了 mojibake,很明显事情出了问题。在 Unicode 时代,这是一个新的游戏。你需要 s/–/-/
.
进行了更改,但也进行了一些其他更改以切换到希望更有洞察力的显示,并切换到 FatRat
计算,因此结果 100% 准确 无限精度:
say sprintf "%-2s: %-24s %s / %s", .key, .value, |.value.nude
for (4.FatRat, 4.25, 108 - (815 - 1500 / * ) / * … *)[^30].pairs
0 : 4 4 / 1
1 : 4.25 17 / 4
2 : 4.470588 76 / 17
3 : 4.644737 353 / 76
4 : 4.770538 1684 / 353
5 : 4.855701 8177 / 1684
6 : 4.910847 40156 / 8177
7 : 4.945537 198593 / 40156
8 : 4.96696258 986404 / 198593
9 : 4.9800457 4912337 / 986404
10: 4.987979448 24502636 / 4912337
11: 4.9927702881 122336033 / 24502636
12: 4.99565589151 611148724 / 122336033
13: 4.99739126838 3054149297 / 611148724
14: 4.998433943945 15265963516 / 3054149297
15: 4.9990600719709 76315468673 / 15265963516
16: 4.9994359371468 381534296644 / 76315468673
17: 4.99966152410377 1907542343057 / 381534296644
18: 4.999796900713418 9537324294796 / 1907542343057
19: 4.999878135477931 47685459212513 / 9537324294796
20: 4.9999268795045999 238423809278164 / 47685459212513
21: 4.99995612706115774 1192108586037617 / 238423809278164
22: 4.999973676005712445 5960511549128476 / 1192108586037617
23: 4.999984205520272708 29802463602463553 / 5960511549128476
24: 4.9999905232822276594 149012035582781284 / 29802463602463553
25: 4.99999431395855959365 745059330625296977 / 149012035582781284
26: 4.99999658837125602371 3725294111260656556 / 745059330625296977
27: 4.999997953021356907988 18626462930705797793 / 3725294111260656556
28: 4.9999987718123113299994 93132291776736534004 / 18626462930705797793
29: 4.9999992630872057845553 465661390253305305137 / 93132291776736534004
Muller's Recurrence 是一个近似值。但是给定迭代的 accuracy/precision 是由先前迭代的 accuracy/precision 决定的。这些又受到所用数字类型和操作的 accuracy/precision 的影响:
使用浮点数/运算在第 12 次左右的迭代后产生无用的结果。
只要数字保持在其精度范围内,使用定点数字/运算就会产生准确的结果,然后很快就会产生无用的结果。
在我的@Holli 代码变体中,我使用了 Raku 的
FatRat
数字类型和操作。这保持了 100% 的准确性和无限的精度。即使是廉价的硬件也可以在不到一秒的时间内轻松完成 1,000 次迭代,准确率为 100%。
穆勒的递推公式在数学上只涉及有理数和运算(“有理数”包括整数)。 Raku 中的数字运算方便地遵循 rules of "infection" 这样 if:
每次迭代中至少有一个是
FatRat
;None的数字是
Num
(浮点数);没有运算引入了一个
Num
(浮点数);
然后每次迭代都会产生另一个 100% 准确的结果 FatRat
。
如果将其中一个数字强制转换为 FatRat
。