From 62f20d05d29f9a180c1c4ea9b8a541d0bbf0d85f Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 13 Aug 2020 15:46:13 +0100 Subject: [PATCH] benchmarks: add Ramanujan's formula for calculating pi --- test/benchmarks/ramanujan_pi.c | 34 ++++++++++++++++++++++++++++ test/benchmarks/ramanujan_pi.inputs | 14 ++++++++++++ test/benchmarks/ramanujan_pi.wasm | Bin 0 -> 2811 bytes 3 files changed, 48 insertions(+) create mode 100644 test/benchmarks/ramanujan_pi.c create mode 100644 test/benchmarks/ramanujan_pi.inputs create mode 100644 test/benchmarks/ramanujan_pi.wasm diff --git a/test/benchmarks/ramanujan_pi.c b/test/benchmarks/ramanujan_pi.c new file mode 100644 index 0000000000..ad757d581f --- /dev/null +++ b/test/benchmarks/ramanujan_pi.c @@ -0,0 +1,34 @@ +#include + +#define WASM_EXPORT __attribute__((visibility("default"))) + +static unsigned factorial(unsigned n) +{ + unsigned ret = 1; + for (unsigned i = n; i > 1; --i) + ret *= i; + return ret; +} + +static double ramanujan_pi(unsigned n) +{ + // This dumb implementation of Ramanujan series calculates 1/pi + double ret = 0.0; + for (unsigned k = 0; k < n; k++) { + double a = factorial(4 * k) / pow(factorial(k), 4.0); + double b = (26390.0 * k + 1103.0) / pow(396.0, 4 * k); + ret += a * b; + } + + // Some intentional f32 -> f64 conversion here + ret *= (2.0f * sqrt(2.0)) / pow(99.0f, 2.0); + + // Return pi + return 1.0 / ret; +} + +WASM_EXPORT unsigned long long ramanujan(unsigned n) +{ + // Display all 16 digits of double precision as a 64-bit integer + return ramanujan_pi(n) * 10000000000000000ULL; +} diff --git a/test/benchmarks/ramanujan_pi.inputs b/test/benchmarks/ramanujan_pi.inputs new file mode 100644 index 0000000000..c7ea179e64 --- /dev/null +++ b/test/benchmarks/ramanujan_pi.inputs @@ -0,0 +1,14 @@ +pi_10_runs +ramanujan +i:I +10 + +31415926535897932 + +pi_30_runs +ramanujan +i:I +30 + +31415926535897932 + diff --git a/test/benchmarks/ramanujan_pi.wasm b/test/benchmarks/ramanujan_pi.wasm new file mode 100644 index 0000000000000000000000000000000000000000..a36b41c3fa2365667b2b5c7a65a63fc45666a9ee GIT binary patch literal 2811 zcmb7GZD?Cn7(VBIBx!Hbq+8~nA)b3c5hn8!%49UTZMJTmA1F=`l{UH#P1ml?($ZmQ zvTlswpUv%uZV0=%Rpt;shM+}lQypVW5U1b|nP^cFMR64o%f=R;_uSm1lkJDM(0lGV z@5l2#@5c$t?i%8ZF}}*^XRM!>_+-CUEb=1$mv~V(4aPOyF!>1Q+|)VKLaX!=ciuf< zSS8kYMXd1MMoT_BlpP++WrrCL4Gj$K%ne46sowxS&ZOaz2eFMYW zbglJt(tyB+n#qfBT!h_X23XW%b1f~{h8T00tu=S`=924ahua3kG)F5)lVtHNOgp5f zg&{&a@DXxKIT>>JmKd`vVa(X!rq1TNf_7sCU2x^FeCC_9=eu72Qrh)b^Al-d&Lp&H z5r$=dk0sLB@LW64WNb0z+8h{pPHKYn0Eo~tk46t4I{E88DbMDXmagkArUakPu<}C3 z?$b`UCwR!nH;yHYN!07u{p*a z4Vio|BBF!R8kbRrj}AIaM1@rlp^d9;q?UX~HRVf$l!ECTQ3|1PY1I`VRuHCAATSD0 z9Y6BohgB}-L<=Y~>rny_U&g*LoKo-VI06a)lO{GFi0Oi|Vt|iw*+BdVpLubso?Hep zjs@DFmTiKB60Ye=_;^DUb-<=!iXEjq-sn$I%36tXN(Wr#{Y+5$8UsZ2SPy#}@(2hZb>>&O?u?i2Sv!`4>XgnO#qPhhU zEwCP(fI^?JJ>~i1$R|-%h=KV* z5KTuf0H7PmtO2w;qGVW38 zJu>N$RsSz@@u3a9w@-eS@-hP#&K>F9|9Q&wGTgcOWPjmHT0VH&!AG`k{hF4wH+Nom zf9L`&^?T|05ldGl+}W-MUQf2eDLiP1hXt_bU9l1dK zy;8|s(eM9O9m34t{K@3Pot<-@OYU4@d~mHLl(cB8hobp!(lf;ni-VDXKT(kCT%G zVd0+O00b&r$pHhy{)DXx-X9oHqS>!z`aWY5%3m!nzmOBA>gMaV6e<>COLSW}DWxc6*ovwo-uLtt-dKZ|r$~K4Z!qm8tAFhN3AcWaM4G8dXMRkm;Dnv7d z`UaN+s&1Ykfyr@aY9co-B6Ouwr>cWI&3ScLi;qfUa9o;$!h|InWhO|{Ach|V)Wc&U zG^)zCLix3Ie<~#l%NX`+s(bCvs%m_YmCVI;m#%iv9nyTwJtQ9tH#66B@j#wF^2BjU-c}jgQGwq)?EQL c{(C9qzZnai|DyZ1D-U!A-*~6>nIBUB0@_Ey>Hq)$ literal 0 HcmV?d00001