September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
|
|
@ -0,0 +1,2 @@
|
|||
agd←{(⍺-⍵)<10*¯8:⍺⋄((⍺+⍵)÷2)∇(⍺×⍵)*÷2}
|
||||
1 agd ÷2*÷2
|
||||
|
|
@ -31,26 +31,19 @@ end run
|
|||
|
||||
|
||||
|
||||
-- GENERIC
|
||||
-- GENERIC FUNCTIONS
|
||||
|
||||
-- until :: (a -> Bool) -> (a -> a) -> a -> a
|
||||
on |until|(p, f, x)
|
||||
set mp to mReturn(p)
|
||||
set mf to mReturn(f)
|
||||
set v to x
|
||||
|
||||
script
|
||||
property p : mp's lambda
|
||||
property f : mf's lambda
|
||||
|
||||
on lambda(v)
|
||||
repeat until p(v)
|
||||
set v to f(v)
|
||||
end repeat
|
||||
return v
|
||||
end lambda
|
||||
end script
|
||||
|
||||
result's lambda(x)
|
||||
tell mReturn(f)
|
||||
repeat until mp's lambda(v)
|
||||
set v to lambda(v)
|
||||
end repeat
|
||||
end tell
|
||||
return v
|
||||
end |until|
|
||||
|
||||
-- Lift 2nd class handler function into 1st class script wrapper
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
/* Calculate the arithmethic-geometric mean of two positive
|
||||
* numbers x and y.
|
||||
* Result will have d digits after the decimal point.
|
||||
*/
|
||||
define m(x, y, d) {
|
||||
auto a, g, o
|
||||
|
||||
o = scale
|
||||
scale = d
|
||||
d = 1 / 10 ^ d
|
||||
|
||||
a = (x + y) / 2
|
||||
g = sqrt(x * y)
|
||||
while ((a - g) > d) {
|
||||
x = (a + g) / 2
|
||||
g = sqrt(a * g)
|
||||
a = x
|
||||
}
|
||||
|
||||
scale = o
|
||||
return(a)
|
||||
}
|
||||
|
||||
scale = 20
|
||||
m(1, 1 / sqrt(2), 20)
|
||||
|
|
@ -1,9 +1,9 @@
|
|||
import std.stdio, std.math, std.typecons, std.typetuple;
|
||||
import std.stdio, std.math, std.meta, std.typecons;
|
||||
|
||||
real agm(real a, real g, in int bitPrecision=60) pure nothrow @nogc @safe {
|
||||
do {
|
||||
//{a, g} = {(a + g) / 2.0, sqrt(a * g)};
|
||||
TypeTuple!(a, g) = tuple((a + g) / 2.0, sqrt(a * g));
|
||||
AliasSeq!(a, g) = tuple((a + g) / 2.0, sqrt(a * g));
|
||||
} while (feqrel(a, g) < bitPrecision);
|
||||
return a;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,11 @@
|
|||
import "futlib/math"
|
||||
|
||||
fun agm(a: f64, g: f64): f64 =
|
||||
let eps = 1.0E-16
|
||||
loop ((a,g)) = while abs(a-g) > eps do
|
||||
loop ((a,g)) = while f64.abs(a-g) > eps do
|
||||
((a+g) / 2.0,
|
||||
sqrt64 (a*g))
|
||||
f64.sqrt (a*g))
|
||||
in a
|
||||
|
||||
fun main(x: f64, y: f64): f64 =
|
||||
agm(x,y)
|
||||
|
|
|
|||
|
|
@ -1,19 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
const ε = 1e-14
|
||||
|
||||
func agm(a, g float64) float64 {
|
||||
for math.Abs(a-g) > math.Abs(a)*ε {
|
||||
a, g = (a+g)*.5, math.Sqrt(a*g)
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
func main() {
|
||||
fmt.Println(agm(1, 1/math.Sqrt2))
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"math/cmplx"
|
||||
)
|
||||
|
||||
const ε = 1e-14
|
||||
|
||||
func agm(a, g complex128) complex128 {
|
||||
for cmplx.Abs(a-g) > cmplx.Abs(a)*ε {
|
||||
a, g = (a+g)*.5, cmplx.Rect(math.Sqrt(cmplx.Abs(a)*cmplx.Abs(g)),
|
||||
(cmplx.Phase(a)+cmplx.Phase(g))*.5)
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
func main() {
|
||||
fmt.Println(agm(1, 1/math.Sqrt2))
|
||||
}
|
||||
|
|
@ -1,25 +1,23 @@
|
|||
/*
|
||||
* Arithmetic-Geometric Mean of 1 & 1/sqrt(2)
|
||||
* Brendan Shaklovitz
|
||||
* 5/29/12
|
||||
*/
|
||||
public class ArithmeticGeometricMean {
|
||||
|
||||
Arithmetic-Geometric Mean of 1 & 1/sqrt(2)
|
||||
|
||||
Brendan Shaklovitz
|
||||
5/29/12
|
||||
|
||||
*/
|
||||
|
||||
public class ArithmeticMean {
|
||||
public static void agm (double a, double g){
|
||||
double a1 = a;
|
||||
double g1 = g;
|
||||
while (Math.abs(a1-g1) >= Math.pow(10, -14)){
|
||||
double aTemp = (a1+g1)/2.0;
|
||||
g1 = Math.sqrt(a1*g1);
|
||||
a1 = aTemp;
|
||||
}
|
||||
System.out.println(a1);
|
||||
public static double agm(double a, double g) {
|
||||
double a1 = a;
|
||||
double g1 = g;
|
||||
while (Math.abs(a1 - g1) >= 1.0e-14) {
|
||||
double arith = (a1 + g1) / 2.0;
|
||||
double geom = Math.sqrt(a1 * g1);
|
||||
a1 = arith;
|
||||
g1 = geom;
|
||||
}
|
||||
return a1;
|
||||
}
|
||||
|
||||
public static void main(String[] args){
|
||||
agm(1,1/Math.sqrt(2));
|
||||
}
|
||||
public static void main(String[] args) {
|
||||
System.out.println(agm(1.0, 1.0 / Math.sqrt(2.0)));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,19 @@
|
|||
// version 1.0.5-2
|
||||
|
||||
fun agm(a: Double, g: Double): Double {
|
||||
var aa = a // mutable 'a'
|
||||
var gg = g // mutable 'g'
|
||||
var ta: Double // temporary variable to hold next iteration of 'aa'
|
||||
val epsilon = 1.0e-16 // tolerance for checking if limit has been reached
|
||||
|
||||
while (true) {
|
||||
ta = (aa + gg) / 2.0
|
||||
if (Math.abs(aa - ta) <= epsilon) return ta
|
||||
gg = Math.sqrt(aa * gg)
|
||||
aa = ta
|
||||
}
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
println(agm(1.0, 1.0 / Math.sqrt(2.0)))
|
||||
}
|
||||
|
|
@ -11,4 +11,4 @@ proc agm(a, g: float,delta: float = 1.0e-15): float =
|
|||
aOld = aNew
|
||||
result = aOld
|
||||
|
||||
echo ($agm(1.0,1.0/sqrt(2)))
|
||||
echo $agm(1.0,1.0/sqrt(2.0))
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ proc agm(x,y: float): tuple[resA,resG: float] =
|
|||
|
||||
(a[23], g[23])
|
||||
|
||||
var t = agm(1, 1/sqrt(2))
|
||||
var t = agm(1, 1/sqrt(2.0))
|
||||
|
||||
echo("Result A: " & formatFloat(t.resA, ffDecimal, 24))
|
||||
echo("Result G: " & formatFloat(t.resG, ffDecimal, 24))
|
||||
|
|
|
|||
|
|
@ -1,14 +0,0 @@
|
|||
import math
|
||||
|
||||
proc agm(a, g: float,delta: float = 1.0e-15): float =
|
||||
var
|
||||
aNew: float = 0
|
||||
aOld: float = a
|
||||
gOld: float = g
|
||||
while (abs(aOld - gOld) > delta):
|
||||
aNew = 0.5 * (aOld + gOld)
|
||||
gOld = sqrt(aOld * gOld)
|
||||
aOld = aNew
|
||||
result = aOld
|
||||
|
||||
echo ($agm(1.0,1.0/sqrt(2)))
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
say agm(1, 1/rxcalcsqrt(2))
|
||||
|
||||
::routine agm
|
||||
use strict arg a, g
|
||||
numeric digits 20
|
||||
|
||||
a1 = a
|
||||
g1 = g
|
||||
|
||||
loop while abs(a1 - g1) >= 1e-14
|
||||
temp = (a1 + g1)/2
|
||||
g1 = rxcalcsqrt(a1 * g1)
|
||||
a1 = temp
|
||||
end
|
||||
numeric digits 9
|
||||
return a1+0
|
||||
|
||||
::requires rxmath LIBRARY
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
(define agm
|
||||
(case-lambda
|
||||
((a0 g0) ; call again with default value for tolerance
|
||||
(agm a0 g0 1e-8))
|
||||
((a0 g0 tolerance) ; called with three arguments
|
||||
(do ((a a0 (* (+ a g) 1/2))
|
||||
(g g0 (sqrt (* a g))))
|
||||
((< (abs (- a g)) tolerance) a)))))
|
||||
|
||||
(display (agm 1 (/ 1 (sqrt 2)))) (newline)
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
import <Utilities/Math.sl>;
|
||||
|
||||
agm(a, g) :=
|
||||
let
|
||||
iota := 1.0e-15;
|
||||
arithmeticMean := 0.5 * (a + g);
|
||||
geometricMean := sqrt(a * g);
|
||||
in
|
||||
a when abs(a-g) < iota
|
||||
else
|
||||
agm(arithmeticMean, geometricMean);
|
||||
|
||||
main := agm(1.0, 1.0 / sqrt(2));
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
func agm(a, g) {
|
||||
loop {
|
||||
var x = [float(a+g / 2), sqrt(a*g)]
|
||||
x == [a, g] && return a
|
||||
x >> \(a, g)
|
||||
var (a1, g1) = ((a+g)/2, sqrt(a*g))
|
||||
[a1,g1] == [a,g] && return a
|
||||
(a, g) = (a1, g1)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
10 LET A=1
|
||||
20 LET G=1/SQR 2
|
||||
30 GOSUB 100
|
||||
40 PRINT AGM
|
||||
50 STOP
|
||||
100 LET A0=A
|
||||
110 LET A=(A+G)/2
|
||||
120 LET G=SQR (A0*G)
|
||||
130 IF ABS(A-G)>.00000001 THEN GOTO 100
|
||||
140 LET AGM=A
|
||||
150 RETURN
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
mata
|
||||
|
||||
real scalar agm(real scalar a, real scalar b) {
|
||||
real scalar c
|
||||
do {
|
||||
c=0.5*(a+b)
|
||||
b=sqrt(a*b)
|
||||
a=c
|
||||
} while (a-b>1e-15*a)
|
||||
return(0.5*(a+b))
|
||||
}
|
||||
|
||||
agm(1,1/sqrt(2))
|
||||
end
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
import Darwin
|
||||
|
||||
enum AGRError : Error {
|
||||
case undefined
|
||||
}
|
||||
|
||||
func agm(_ a: Double, _ g: Double, _ iota: Double = 1e-8) throws -> Double {
|
||||
var a = a
|
||||
var g = g
|
||||
var a1: Double = 0
|
||||
var g1: Double = 0
|
||||
|
||||
guard a * g >= 0 else {
|
||||
throw AGRError.undefined
|
||||
}
|
||||
|
||||
while abs(a - g) > iota {
|
||||
a1 = (a + g) / 2
|
||||
g1 = sqrt(a * g)
|
||||
a = a1
|
||||
g = g1
|
||||
}
|
||||
|
||||
return a
|
||||
}
|
||||
|
||||
do {
|
||||
try print(agm(1, 1 / sqrt(2)))
|
||||
} catch {
|
||||
print("agr is undefined when a * g < 0")
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
a:=1.0; g:=1.0/(2.0).sqrt();
|
||||
while(not a.closeTo(g,1.0e-15)){
|
||||
a1:=(a+g)/2.0; g=(a*g).sqrt(); a=a1;
|
||||
println(a," ",g," ",a-g);
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
fcn(a=1.0, g=1.0/(2.0).sqrt()){ println(a," ",g," ",a-g);
|
||||
if(a.closeTo(g,1.0e-15)) return(a) else return(self.fcn((a+g)/2.0, (a*g).sqrt()));
|
||||
}()
|
||||
Loading…
Add table
Add a link
Reference in a new issue