Moscow 5

Assignment 1

This is a Pi calculator that calculates pi up to n digits using the arctan formula pi=16arctan(1/5)-4arctan(1/239) as the main formula along with another variation of the formula based on the same method.

We will be optimizing the following functions:

The arctan method:

void arctan(int multiplier, int denom, int sign)
{
INDEXER x;
LONG remain, temp, divisor, denom2;
SHORT NotZero = 1;

for (x = 0; x < size; x++)
powers[x] = 0;

divisor = 1;
denom2 = (LONG)denom;denom2 *= denom2;

remain = (LONG)multiplier * denom;
while (NotZero)
{
for (x = adv; x < size; x++)
{
temp = (LONG)powers[x] + remain;
powers[x] = (SHORT)(temp / denom2);
remain = (temp - (denom2 * (LONG)powers[x])) * BASE;
}

remain = 0;
for (x = adv; x < size; x++)
{
temp = (LONG)powers[x] + remain;
term[x] = (SHORT)(temp / divisor);
remain = (temp - (divisor * (LONG)term[x])) * BASE;
}
remain = 0;

if (sign > 0)
{
LONG carry, sum;

carry = 0;
for (x = size - 1; x >=0; x--)
{
sum = (LONG)pi[x] + (LONG)term[x] + carry;
carry = 0;
if (sum >= BASE)
{
carry = 1;
sum -= BASE;
}
pi[x] = (SHORT)sum;
}
}
else
{
LONG borrow, sum;

borrow = 0;
for (x = size - 1; x >= 0; x--)
{
sum = (LONG)pi[x] - (LONG)term[x] - borrow;
borrow = 0;
if (sum < 0)
{
borrow = 1;
sum += BASE;
}
pi[x] = (SHORT)sum;
}
}

sign = -sign;
divisor += 2;
NotZero = 0;
for (x = adv; x < size; x++)
{
if (powers[x])
{
NotZero = 1;
break;
}
}

if (NotZero)
{
while (powers[adv] == 0)