[ create a new paste ] login | about

Link: http://codepad.org/M5xYr0TO    [ raw code | output | fork ]

C, pasted on Mar 3:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <float.h>

const long PRECISION = 2000;
const int CALC_PREC = 7;

const int PRINT_FROM = 0;
const int PRINT_TO = 100;

long base;
long last;

void add(long z[], long x[], long y[])
{
   long i, t, r = 0;
   for (i = last; i >= 0; --i) {
      t = x[i] + y[i] + r;
      r = t / base;
      z[i] = t - r * base;
   }
}

void sub(long z[], long x[], long y[])
{
   long i, t, r = 1;
   for (i = last; i >= 0; --i) {
      t = x[i] + (base - y[i] - 1) + r;
      r = t / base;
      z[i] = t - r * base;
   }
}

void mul(long z[], long x[], long k)
{
   long i, t, r = 0;
   for (i = last; i >= 0; --i) {
      t = x[i] * k + r;
      r = t / base;
      z[i] = t - r * base;
   }
}

void dvd(long z[], long x[], long k)
{
   long i, r = 0;
   double t;
   for (i = 0; i <= last; ++i) {
      t = x[i] + (double)r * base;
      z[i] = t / k;
      r = t - (double)k * z[i];
   }
}

void arctan(long z[], long k)
{
   static long* u = 0, *t;
   long i;

   if (!u) {
      t = malloc((last + 1) * sizeof(long));
      u = calloc(last + 1, sizeof(long));
      u[0] = 1;
   }

   memset(z, 0, (last + 1) * sizeof(long));

   for (i = (long)(0.5 * PRECISION / log10(k)) + 1; i >= 1; --i) {
      dvd(t, u, 2 * i + 1);
      sub(z, t, z);
      dvd(z, z, k);
      dvd(z, z, k);
   }
   sub(z, u, z);
   dvd(z, z, k);
}

void print(long x[], size_t i_start, size_t i_end)
{
   long i, s;

   if (i_start == 0)
      printf("PI=3.\n");
   else
      --i_start;

   i = i_start / 50 * 50;
   s = base / pow(10, i % CALC_PREC);

   for (; i < i_end && i < PRECISION; ++i) {
      s /= 10;

      if (i >= i_start) {
         if (i % 1000 == 0)
            putchar('\n');
         printf("%ld", (x[i / CALC_PREC + 1] / s) % 10);
      }
      else
         putchar(' ');

      if (i % 50 == 49)
         putchar('\n');
      else if (i % 10 == 9)
         putchar(' ');

      if (s == 1)
         s = base;
   }

   if (i % 50 != 0)
      putchar('\n');
}

int main()
{
   long *x, *y, *z, *w;

   base = pow(10, CALC_PREC);
   last = ceil((double)PRECISION / CALC_PREC) + 1;

   x = malloc((last + 1) * sizeof(long));
   y = malloc((last + 1) * sizeof(long));
   z = malloc((last + 1) * sizeof(long));
   w = malloc((last + 1) * sizeof(long));

   arctan(x, 2);
   arctan(y, 5);
   arctan(z, 8);
   mul(x, x, 4);
   mul(y, y, 4);
   mul(z, z, 4);
   add(x, x, y);
   add(x, x, z);
   add(x, x, w);

   print(x, PRINT_FROM, PRINT_TO);

   return 0;
}
/* 4a(1/2)+4a(1/5)+4a(1/8) */


Output:
1
2
3
4
In function `print':
undefined reference to `pow'
In function `arctan':
undefined reference to `log10'


Create a new paste based on this one


Comments: