Data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 7387c8f97b
commit cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions

View file

@ -0,0 +1,87 @@
import "./fmt" for Fmt
var eps = 1e-6
System.print("From the definition, err. 3e-10")
var n = 400
var h = 1
for (k in 2..n) h = h + 1/k
//faster convergence: Negoi, 1997
var a = (n + 0.5 + 1/(24*n)).log
Fmt.print("Hn $0.14f", h)
Fmt.print("gamma $0.14f\nk = $d\n", h - a, n)
System.print("Sweeney, 1963, err. idem")
n = 21
var s = [0, n]
var r = n
var k = 1
while (true) {
k = k + 1
r = r * n / k
s[k & 1] = s[k & 1] + r/k
if (r <= eps) break
}
Fmt.print("gamma $0.14f\nk = $d\n", s[1] - s[0] - n.log, k)
System.print("Bailey, 1988")
n = 5
a = 1
h = 1
var n2 = 2.pow(n)
r = 1
k = 1
while (true) {
k = k + 1
r = r * n2 / k
h = h + 1/k
var b = a
a = a + r * h
if ((b-a).abs <= eps) break
}
a = a * n2 / n2.exp
Fmt.print("gamma $0.14f\nk = $d\n", a - n * 2.log, k)
System.print("Brent-McMillan, 1980")
n = 13
a = -n.log
var b = 1
var u = a
var v = b
n2 = n * n
var k2 = 0
k = 0
while (true) {
k2 = k2 + 2*k + 1
k = k + 1
a = a * n2 / k
b = b * n2 / k2
a = (a + b)/k
u = u + a
v = v + b
if (a.abs <= eps) break
}
Fmt.print("gamma $0.14f\nk = $d\n", u / v, k)
System.print("How Euler did it in 1735")
// Bernoulli numbers with even indices
var b2 = [1, 1/6, -1/30, 1/42, -1/30, 5/66, -691/2730, 7/6, -3617/510, 43867/798]
var m = 7
n = 10
// n'th harmonic number
h = 1
for (k in 2..n) h = h + 1/k
Fmt.print("Hn $0.14f", h)
h = h - n.log
Fmt.print(" -ln $0.14f", h)
// expansion C = -digamma(1)
a = -1 / (2*n)
n2 = n * n
r = 1
for (k in 1..m) {
r = r * n2
a = a + b2[k] / (2*k*r)
}
Fmt.print("err $0.14f\ngamma $0.14f\nk = $d", a, h + a, n + m)
System.print("\nC = 0.57721566490153286...")

View file

@ -0,0 +1,44 @@
import "./gmp" for Mpf
var euler = Fn.new { |n, r, s, t|
// decimal precision
var e10 = (n/0.6).floor
// binary precision
var e2 = ((1 + n/0.6)/0.30103).round
Mpf.defaultPrec = e2
var b = Mpf.new().log(Mpf.from(16).div(15))
var a = b.mul(r)
b = Mpf.new().log(Mpf.from(25).div(24))
a.add(b.mul(s))
b = Mpf.new().log(Mpf.from(81).div(80))
var u = b * t
a.add(u).neg
b.set(1)
u.set(a)
var v = Mpf.from(b)
var k = 0
var n2 = n * n
var k2 = Mpf.zero
while (true) {
k2.add((k << 1) + 1)
k = k + 1
b.mul(n2).div(k2)
a.mul(n2).div(k).add(b).div(k)
u.add(a)
v.add(b)
var e = Mpf.frexp(a)[1]
if (e.abs >= e2) break
}
u.div(v)
System.print("gamma %(u.toString(10, 100)) (maxerr. 1e-%(e10))")
System.print("k = %(k)")
}
var start = System.clock
euler.call(60, 41, 30, 18)
euler.call(4800, 85, 62, 37)
euler.call(9375, 91, 68, 40)
euler.call(18750, 98, 73, 43)
System.print("\nTook %(System.clock - start) seconds.")

View file

@ -0,0 +1,5 @@
import "./gmp" for Mpf
var prec = (101/0.30103).round
var gamma = Mpf.euler(prec)
System.print(gamma.toString(10, 100))