Skip to content

Instantly share code, notes, and snippets.

@fredrik-johansson
Created December 31, 2013 15:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fredrik-johansson/8198432 to your computer and use it in GitHub Desktop.
Save fredrik-johansson/8198432 to your computer and use it in GitHub Desktop.
bsdnt exp(1) benchmark program
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "nn.h"
#include "test.h"
#include "zz.h"
void
zz_bsplit(zz_t p, zz_t q, ulong a, ulong b)
{
if (b - a == 1)
{
zz_seti(p, 1);
zz_seti(q, b);
}
else
{
ulong m;
zz_t p1, q2;
zz_init(p1);
zz_init(q2);
m = a + (b - a) / 2;
zz_bsplit(p1, q, a, m);
zz_bsplit(p, q2, m, b);
zz_mul(p1, p1, q2);
zz_add(p, p, p1);
zz_mul(q, q, q2);
zz_clear(p1);
zz_clear(q2);
}
}
void zz_e(zz_t y, ulong prec)
{
ulong N;
zz_t p, q;
N = 1.1 * prec / log(prec) + 20;
zz_init(p);
zz_init(q);
zz_bsplit(p, q, 0, N);
zz_add(p, p, q);
zz_mul_2exp(p, p, prec);
zz_div(y, p, q);
zz_clear(p);
zz_clear(q);
}
void time_e(void)
{
ulong digits, prec, count, iter;
clock_t t;
zz_t y;
zz_init(y);
zz_e(y, 333);
zz_print(y);
printf("\n");
for (digits = 100; digits <= 10000000; digits *= 10)
{
prec = digits * 3.333;
printf("digits = %lu: ", digits);
fflush(stdout);
iter = 1;
if (digits == 100) iter = 100000;
if (digits == 1000) iter = 10000;
if (digits == 10000) iter = 100;
if (digits == 100000) iter = 10;
if (digits == 1000000) iter = 1;
t = clock();
for (count = 0; count < iter; count++)
zz_e(y, prec);
t = clock() - t;
printf("%g s\n", ((double) t) / CLOCKS_PER_SEC / iter);
}
zz_clear(y);
}
int main(void)
{
time_e();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment