Arithmetic-geometric mean: Difference between revisions

Content added Content deleted
No edit summary
Line 1,549: Line 1,549:
=={{header|Lambdatalk}}==
=={{header|Lambdatalk}}==
<syntaxhighlight lang="Scheme">
<syntaxhighlight lang="Scheme">
{def eps 1e-15}
-> eps

{def agm
{def agm
{lambda {:a :g}
{def agm.r
{lambda {:an :gn :tol}
{if {> {abs {- :a :g}} {eps}}
{if {> {abs {- :an :gn}} :tol}
then {agm {/ {+ :a :g} 2}
then {agm.r {/ {+ :an :gn} 2} {sqrt {* :an :gn}} :tol}
{sqrt {* :a :g}}}
else :an }}}
else :a }}}
{lambda {:a0 :g0}
{agm.r {/ {+ :a0 :g0} 2} {sqrt {* :a0 :g0}} 1e-15}}}
-> agm
-> agm


Line 1,562: Line 1,563:
-> 0.8472130847939792
-> 0.8472130847939792


Using the lib_BN library we compute 70 digits
Multi-precision version using the lib_BN library


{BN.DEC 70}
-> 70 digits
{def EPS {BN./ 1 {BN.pow 10 45}}}
-> EPS
{def AGM
{def AGM
{lambda {:a :g}
{def AGM.r
{if {= {BN.compare {BN.abs {BN.- :a :g}} {EPS}} 1}
{lambda {:an :gn :tol}
{if {= {BN.compare {BN.abs {BN.- :an :gn}} :tol} 1}
then {AGM {BN./ {BN.+ :a :g} 2}
then {AGM.r {BN./ {BN.+ :an :gn} 2}
{BN.sqrt {BN.* :a :g}}}
{BN.sqrt {BN.* :an :gn}}
else :a }}}
:tol}
else :an }}}
{lambda {:a0 :g0}
{AGM.r {BN./ {BN.+ :a0 :g0} 2}
{BN.sqrt {BN.* :a0 :g0}}
{BN./ 1 {BN.pow 10 45}}}}}
-> AGM
-> AGM

{BN.DEC 70}
-> 70 digits


{AGM 1 {BN./ 1 {BN.sqrt 2}}}
{AGM 1 {BN./ 1 {BN.sqrt 2}}}
-> 0.8472130847939790866064991234821916364814459103269421850605793726597339
-> 0.8472130847939790866064991234821916364814459103269421850605793726597339
</syntaxhighlight>
</syntaxhighlight>



=={{header|LFE}}==
=={{header|LFE}}==