Data update

This commit is contained in:
Ingy döt Net 2026-04-30 12:34:36 -04:00
parent 4bb20c9b71
commit cbaf4c4b64
12390 changed files with 318560 additions and 27248 deletions

View file

@ -0,0 +1,12 @@
# syntax: GAWK -f EULERS_CONSTANT.AWK
# converted from LUA
BEGIN {
Hn = 1
n = 10^8
for (i=2; i<=n; i++) {
Hn += (1/i)
}
gamma = Hn - log(n)
printf("%.8f\n",gamma)
exit(0)
}

View file

@ -0,0 +1,47 @@
with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;
with Ada.Numerics.Long_Elementary_Functions; use Ada.Numerics.Long_Elementary_Functions;
with Ada.Text_IO; use Ada.Text_IO;
procedure Eulers_Constant is
function Euler_Vacca (Iterations : Integer) return Long_Float is
Gamma : Long_Float := 1.0;
Term : Long_Float;
Power : Long_Integer;
Sign : Long_Float;
begin
Gamma := 0.5 - (1.0 / 3.0);
for I in 2 .. Iterations loop
Power := 2 ** Natural (I);
Sign := -1.0;
Term := 0.0;
for Domin in Power .. (2 * Power - 1) loop
Sign := - (Sign);
Term := Term + Sign / Long_Float (Domin);
end loop;
Gamma := Gamma + (Long_Float (I) * Term);
end loop;
return Gamma;
end Euler_Vacca;
-- Ada Float type is IEEE 754 32-bit, giving 9 decimal digits of precision
Euler_Castellanos_Float : constant Float :=
(((80.0 ** 3) + 92.0) /
(61.0 ** 4)) ** (1.0 / 6.0);
-- Ada Long_Float type is IEEE 754 32-bit, giving 14 decimal digits of precision
Euler_Castellanos_Long_Float : constant Long_Float :=
(990.0 ** 3 - 55.0 ** 3 - 79.0 ** 2 - 16.0) /
70.0 ** 5;
Iters : Integer;
begin
Put_Line ("Its. Vacca");
Iters := 2;
while Iters <= 32 loop
Put_Line (Iters'Image & " " & Euler_Vacca (Iters)'Image);
Iters := Iters + 2;
end loop;
Put_Line ("Castellanos approximation for standard Float (9 digits): " & Euler_Castellanos_Float'Image);
Put_Line ("Castellanos approximation for Long Float (14 digits): " & Euler_Castellanos_Long_Float'Image);
end Eulers_Constant;

View file

@ -0,0 +1,45 @@
function ByVaccaSeries(numTerms) {
// this method is simple but converges slowly
// calculate gamma by:
// 1 * (1/2 - 1/3) +
// 2 * (1/4 - 1/5 + 1/6 - 1/7) +
// 3 * (1/8 - 1/9 + 1/10 - 1/11 + 1/12 - 1/13 + 1/14 - 1/15) +
// 4 * ( . . . ) +
// . . .
let gamma = 0;
let next = 4;
for (let numerator = 1; numerator < numTerms; ++numerator) {
let delta = 0;
for (let denominator = next / 2; denominator < next; denominator += 2) {
// calculate terms two at a time
delta += 1.0 / denominator - 1.0 / (denominator + 1);
}
gamma += numerator * delta;
next *= 2;
}
return gamma;
}
// based on the C entry
function ByEulersMethod() {
//Bernoulli numbers with even indices
const B2 = [1.0, 1.0 / 6, -1.0 / 30, 1.0 / 42, -1.0 / 30,
5.0 / 66, -691.0 / 2730, 7.0 / 6];
const n = 10;
//n-th harmonic number
const h = (() => // immediately invoked function expression
{
let sum = 1;
for (let k = 2; k <= n; k++) { sum += 1.0 / k; }
return sum - Math.log(n);
})();
//expansion C = -digamma(1)
let a = -1.0 / (2 * n);
let r = 1;
for (let k = 1; k < B2.length; k++) {
r *= n * n;
a += B2[k] / (2 * k * r);
}
return h + a;
}
console.log("Vacca series: " + ByVaccaSeries(32).toPrecision(16));
console.log("Eulers method: " + ByEulersMethod().toPrecision(16));

View file

@ -1,6 +1,4 @@
(phixonline)-->
<span style="color: #000080;font-style:italic;">-- demo\rosetta\Eulers_constant.exw</span>
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">C</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_div</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1e6</span><span style="color: #0000FF;">)))-</span><span style="color: #7060A8;">log</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1e6</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"gamma %.12f (max 12d.p. of accuracy)\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">C</span><span style="color: #0000FF;">)</span>
<!--
-- demo\rosetta\Eulers_constant.exw
with javascript_semantics
constant C = sum(sq_div(1,tagset(1e6)))-log(1e6)
printf(1,"gamma %.12f (max 12d.p. of accuracy)\n",C)

View file

@ -1,89 +1,87 @@
-->
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- no mpfr_get_d_2exp() in mpfr.js as yet</span>
<span style="color: #7060A8;">requires</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"1.0.2"</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- mpfr_get_d_2exp(), mpfr_addmul_si()</span>
<span style="color: #008080;">include</span> <span style="color: #004080;">mpfr</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
<span style="color: #004080;">mpfr</span> <span style="color: #000000;">u</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">k2</span><span style="color: #0000FF;">;</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">e10</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">e2</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">f</span>
without js -- no mpfr_get_d_2exp() in mpfr.js as yet
requires("1.0.2") -- mpfr_get_d_2exp(), mpfr_addmul_si()
include mpfr.e
mpfr u, v, k2;
integer e, e10, e2
atom f
<span style="color: #000080;font-style:italic;">//log(x/y) with the Taylor series for atanh(x-y/x+y)</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">ln</span><span style="color: #0000FF;">(</span><span style="color: #004080;">mpfr</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">mpfr</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">u</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">q</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">;</span>
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">((</span><span style="color: #000000;">x</span><span style="color: #0000FF;">-</span><span style="color: #000000;">y</span><span style="color: #0000FF;">)==</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">mpfr_set_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">+</span><span style="color: #000000;">y</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">mpfr_si_div</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// s = 1 / (x + y)</span>
<span style="color: #7060A8;">mpfr_mul</span><span style="color: #0000FF;">(</span><span style="color: #000000;">k2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// k2 = s * s</span>
<span style="color: #7060A8;">mpfr_set</span><span style="color: #0000FF;">(</span><span style="color: #000000;">d</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">k</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">;</span>
<span style="color: #7060A8;">mpfr_mul</span><span style="color: #0000FF;">(</span><span style="color: #000000;">d</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">k2</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// d *= k2</span>
<span style="color: #7060A8;">mpfr_div_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">q</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">d</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// q = d / k</span>
<span style="color: #7060A8;">mpfr_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">q</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// s += q</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">f</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">mpfr_get_d_2exp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">q</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">e</span><span style="color: #0000FF;">)>=</span><span style="color: #000000;">e2</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #7060A8;">mpfr_mul_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">//s *= 2</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
//log(x/y) with the Taylor series for atanh(x-y/x+y)
procedure ln(mpfr s, integer x, y)
mpfr d = u, q = v;
assert((x-y)==1)
mpfr_set_si(s, x+y)
mpfr_si_div(s, 1, s) // s = 1 / (x + y)
mpfr_mul(k2, s, s) // k2 = s * s
mpfr_set(d, s)
integer k = 1
while true do
k += 2;
mpfr_mul(d, d, k2) // d *= k2
mpfr_div_si(q, d, k) // q = d / k
mpfr_add(s, s, q) // s += q
{f,e} = mpfr_get_d_2exp(q)
if abs(e)>=e2 then exit end if
end while
mpfr_mul_si(s, s, 2) //s *= 2
end procedure
<span style="color: #004080;">mpfr</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">60</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- (required precision in decimal dp *6/10)</span>
<span style="color: #000000;">n2</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">41</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">30</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">18</span><span style="color: #0000FF;">;</span>
mpfr a, b
integer k,
n = 60, -- (required precision in decimal dp *6/10)
n2,
r = 41,
s = 30,
t = 18;
<span style="color: #000080;font-style:italic;">// n = 2^i * 3^j * 5^k
// n = 2^i * 3^j * 5^k
// log(n) = r * log(16/15) + s * log(25/24) + t * log(81/80)
// log(n) = r * log(16/15) + s * log(25/24) + t * log(81/80)
// solve linear system for r, s, t
// 4 -3 -4| i
// -1 -1 4| j
// -1 2 -1| k
// solve linear system for r, s, t
// 4 -3 -4| i
// -1 -1 4| j
// -1 2 -1| k
//decimal precision</span>
<span style="color: #000000;">e10</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0.6</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">//binary precision</span>
<span style="color: #000000;">e2</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">1</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">e10</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">/</span> <span style="color: #000000;">0.30103</span><span style="color: #0000FF;">)</span>
//decimal precision
e10 = floor(n/0.6)
//binary precision
e2 = floor((1 + e10) / 0.30103)
<span style="color: #7060A8;">mpfr_set_default_precision</span><span style="color: #0000FF;">(</span><span style="color: #000000;">e2</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">u</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">k2</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpfr_inits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">5</span><span style="color: #0000FF;">)</span>
mpfr_set_default_precision(e2)
{a, b, u, v, k2} = mpfr_inits(5)
<span style="color: #000080;font-style:italic;">//Compute log terms</span>
<span style="color: #000000;">ln</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">16</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">15</span><span style="color: #0000FF;">)</span> <span style="color: #7060A8;">mpfr_mul_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// a = r * b</span>
<span style="color: #000000;">ln</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">25</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">24</span><span style="color: #0000FF;">)</span> <span style="color: #000000;">mpfr_addmul_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// a += s * b</span>
<span style="color: #000000;">ln</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">81</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">80</span><span style="color: #0000FF;">)</span> <span style="color: #000000;">mpfr_addmul_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// a += t * b</span>
//Compute log terms
ln(b, 16, 15) mpfr_mul_si(a, b, r) // a = r * b
ln(b, 25, 24) mpfr_addmul_si(a, b, s) // a += s * b
ln(b, 81, 80) mpfr_addmul_si(a, b, t) // a += t * b
<span style="color: #000000;">mpfr_neg</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// a = -a</span>
<span style="color: #7060A8;">mpfr_set_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// b = 1</span>
<span style="color: #7060A8;">mpfr_set</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">u</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">mpfr_set</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">v</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
mpfr_neg(a, a) // a = -a
mpfr_set_si(b, 1) // b = 1
mpfr_set (u, a)
mpfr_set (v, b)
<span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">;</span>
<span style="color: #000000;">n2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">;</span>
<span style="color: #7060A8;">mpfr_set_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">k2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// k2 = k * k (as below)</span>
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">mpfr_add_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">k2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">k2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">*</span><span style="color: #000000;">2</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// k2 += 2k + 1</span>
<span style="color: #000000;">k</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">;</span>
k = 0;
n2 = n * n;
mpfr_set_si(k2, 0) // k2 = k * k (as below)
while true do
mpfr_add_si(k2, k2, k*2+1) // k2 += 2k + 1
k += 1;
<span style="color: #7060A8;">mpfr_div</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">k2</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">mpfr_mul_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">n2</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// b = b * n2 / k2</span>
mpfr_div(b, b, k2)
mpfr_mul_si(b, b, n2) // b = b * n2 / k2
<span style="color: #7060A8;">mpfr_div_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">mpfr_mul_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">n2</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">mpfr_add</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">mpfr_div_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// a = (a * n2 / k + b) / k</span>
mpfr_div_si(a, a, k)
mpfr_mul_si(a, a, n2)
mpfr_add (a, a, b)
mpfr_div_si(a, a, k) // a = (a * n2 / k + b) / k
<span style="color: #7060A8;">mpfr_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">u</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">u</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// u += a</span>
<span style="color: #7060A8;">mpfr_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">v</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">// v += b</span>
mpfr_add(u, u, a) // u += a
mpfr_add(v, v, b) // v += b
<span style="color: #0000FF;">{</span><span style="color: #000000;">f</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">mpfr_get_d_2exp</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">e</span><span style="color: #0000FF;">)>=</span><span style="color: #000000;">e2</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
{f,e} = mpfr_get_d_2exp (a)
if abs(e)>=e2 then exit end if
end while
<span style="color: #7060A8;">mpfr_div</span><span style="color: #0000FF;">(</span><span style="color: #000000;">u</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">u</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">su</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpfr_get_fixed</span><span style="color: #0000FF;">(</span><span style="color: #000000;">u</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e10</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"gamma %s (maxerr. 1e-%d)\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">su</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">e10</span><span style="color: #0000FF;">})</span>
<!--
mpfr_div(u, u, v)
string su = mpfr_get_fixed(u,e10)
printf(1,"gamma %s (maxerr. 1e-%d)\n", {su, e10})

View file

@ -1,8 +1,6 @@
-->
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- no mpfr_const_euler() in mpfr.js as yet</span>
<span style="color: #7060A8;">requires</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"1.0.1"</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- mpfr_const_euler()</span>
<span style="color: #008080;">include</span> <span style="color: #004080;">mpfr</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
<span style="color: #004080;">mpfr</span> <span style="color: #000000;">gamma</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpfr_init</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">100</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">mpfr_const_euler</span><span style="color: #0000FF;">(</span><span style="color: #000000;">gamma</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"gamma %s (mpfr_const_euler)\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">mpfr_get_fixed</span><span style="color: #0000FF;">(</span><span style="color: #000000;">gamma</span><span style="color: #0000FF;">,</span><span style="color: #000000;">100</span><span style="color: #0000FF;">)})</span>
<!--
without js -- no mpfr_const_euler() in mpfr.js as yet
requires("1.0.1") -- mpfr_const_euler()
include mpfr.e
mpfr gamma = mpfr_init(0,-100)
mpfr_const_euler(gamma)
printf(1,"gamma %s (mpfr_const_euler)\n",{mpfr_get_fixed(gamma,100)})

View file

@ -0,0 +1,86 @@
local fmt = require "fmt"
local eps <const> = 1e-6
print("From the definition, err. 3e-10")
local n = 400
local h = 1
for k = 2, n do h += 1 / k end
-- Faster convergence: Negoi, 1997.
local a = math.log(n + 0.5 + 1 / (24 * n))
fmt.print("Hn %0.14f", h)
fmt.print("gamma %0.14f\nk = %d\n", h - a, n)
print("Sweeney, 1963, err. idem")
n = 21
local s = {0, n}
local r = n
local k = 1
repeat
k += 1
r *= n / k
s[(k & 1) + 1] += r / k
until r <= eps
fmt.print("gamma %0.14f\nk = %d\n", s[2] - s[1] - math.log(n), k)
print("Bailey, 1988")
n = 5
a = 1
h = 1
local n2 = 1 << n
r = 1
k = 1
repeat
k += 1
r *= n2 / k
h += 1 / k
local b = a
a += r * h
until math.abs(b - a) <= eps
a *= n2 / math.exp(n2)
fmt.print("gamma %0.14f\nk = %d\n", a - n * math.log(2), k)
print("Brent-McMillan, 1980")
n = 13
a = -math.log(n)
local b = 1
local u = a
local v = b
n2 = n * n
local k2 = 0
k = 0
repeat
k2 += 2 * k + 1
k += 1
a *= n2 / k
b *= n2 / k2
a = (a + b) / k
u += a
v += b
until math.abs(a) <= eps
fmt.print("gamma %0.14f\nk = %d\n", u / v, k)
print("How Euler did it in 1735")
-- Bernoulli numbers with even indices.
local b2 = {1, 1/6, -1/30, 1/42, -1/30, 5/66, -691/2730, 7/6, -3617/510, 43867/798}
local m = 7
n = 10
-- n'th harmonic number.
h = 1
for l = 2, n do h += 1 / l end
fmt.print("Hn %0.14f", h)
h -= math.log(n)
fmt.print(" -ln %0.14f", h)
-- Expansion C = -digamma(1).
a = -1 / (2 * n)
n2 = n * n
r = 1
for l = 1, m do
r *= n2
a += b2[l + 1] / (2 * l * r)
end
fmt.print("err %0.14f\ngamma %0.14f\nk = %d", a, h + a, n + m)
print("\nC = 0.57721566490153286...")

View file

@ -0,0 +1,59 @@
require "bignum"
local function euler(n, r, s, t)
-- Decimal precision.
local e10 = math.floor(n / 0.6)
-- Binary precision.
local e2 = math.round((1 + n / 0.6) / 0.30103)
-- Start with mpfr for the logs.
mpfr.init(e2)
local b = mpfr.log(new bigrat(16, 15, true, false), 2)
mpfr.mul(b, r)
local a = mpfr.setVar(1, b)
mpfr.log(new bigrat(25, 24, true, false), b)
mpfr.mul(b, s)
mpfr.addVar(a, b)
mpfr.log(new bigrat(81, 80, true, false), b)
mpfr.mul(b, t)
local u = mpfr.setVar(3, b)
mpfr.addVar(a, u)
mpfr.neg(a)
-- Switch to mpf for the basic arithmetic.
mpf.init(e2)
a = mpf.liftVar(1, a)
b = mpf.set(b, 1)
mpf.setVar(u, a)
local v = mpf.setVar(4, b)
local k = 0
local n2 = mpf.set(5, n * n)
local k2 = mpf.set(6, 0)
repeat
mpf.add(k2, (k << 1) + 1)
k += 1
mpf.mulVar(b, n2)
mpf.divVar(b, k2)
mpf.mulVar(a, n2)
mpf.div(a, k)
mpf.addVar(a, b)
mpf.div(a, k)
mpf.addVar(u, a)
mpf.addVar(v, b)
local e = mpf.frx(a, true)
until math.abs(e) >= e2
mpf.divVar(u, v)
local st = mpf.getStr(u, 10, 100)
print($"gamma {st} (maxerr. 1e-{e10})")
print($"k = {k}\n")
for i = 1, 6 do
mpfr.clear(i)
mpf.clear(i)
end
end
euler(60, 41, 30, 18)
euler(4800, 85, 62, 37)
euler(9375, 91, 68, 40)
euler(18750, 98, 73, 43)

View file

@ -0,0 +1,6 @@
require "bignum"
local bits = math.round(100 / 0.30103)
mpfr.init(bits, 100)
mpfr.convert(false)
print(mpfr.euler())

View file

@ -0,0 +1,18 @@
Rebol [
title: "Rosetta code: Euler's constant 0.5772..."
file: %Euler's_constant.r3
url: https://rosettacode.org/wiki/Euler%27s_constant_0.5772...
]
euler-constant: func [
"Compute Euler's constant γ ≈ 0.5772... using the classic definition"
iterations [integer!]
/local sum
][
sum: 0.0
repeat i iterations [sum: sum + (1.0 / i)]
sum - log-e iterations
]
e: euler-constant 1000000 ;== 0.577216164900715
assert [e = 0.577216164900715]