#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <pthread.h>


void Pass1(register unsigned char digits[10000], register int totals[10]); 
//void Pass2(long int digits);
//void Pass3(long int digits);
//void Pass4(long int digits);
//void Pass5(long int digits);

/*
struct massive{
signed var1 : 32;
signed var2 : 32;
signed var3 : 32;
signed var4 : 32;
};
*/

struct massive{ 
	long double var1;
	long double var2;
	long double var3;
	long double var4;
};

struct massive a;


void Pass2(long int digits);


int main(){
	FILE* fp;
	char buf[150];
	char temp[2];
	int counter1;
	int counter2 = 0;
	int linenum1 = 0;
	long unsigned int sum1 = 0;
	unsigned char digits[10000];

        pthread_t threads[5];
        int iret[5];


	/*
	int digits[] = 
		{1,4,1,5,
	9,2,6,5,
	3,5,8,9,
	7,9,3,2,
	3,8,4,6,
	2,6,4,3,
	3,8,3,2,7,9,5,0,2,
		8,8,4,1,9,7,1,6,9,3,9,9,3,7,5,1,0,5,8,2,0,9,7,4,9,4,4,5,9,2,3,0,7,8,
		1,6,4,0,6,2,8,6,2,0,8,9,9,8,6,2,8,0,3,4,8,2,5,3,4,2,1,1,7,0,6,7,9};

	//11 22 25 21 21 15 
	*/

	int totals[] =
		{0,0,0,0,0,0,0,0,0,0};

        if( ( fp = fopen( "10k.txt", "r" ) ) == NULL ) {
                fprintf( stderr, "Error opening 10k.txt\n" );
                exit( 1 );
        }

        while( fgets(buf, sizeof(buf), fp) != NULL)
        {
		for(counter1 = 0; counter1 < strlen(buf); counter1++){
			if(buf[counter1] != ' ' && buf[counter1] != '\n'){
				temp[0]=buf[counter1];
				temp[1]='\0';
				digits[counter2]=atoi(temp);
				counter2++;
			}
		}
		//linenum1++;
	}

	
	fclose( fp );

	Pass1(digits, totals);
	//Pass2( 100000000000000000);

	a.var1 = 0;
        a.var2 = 0;
        a.var3 = 0;
        a.var4 = 0;

        iret[0] = pthread_create( &threads[0], NULL, Pass2, 3);
        iret[1] = pthread_create( &threads[1], NULL, Pass2, 1000000003);
        iret[2] = pthread_create( &threads[2], NULL, Pass2, 2000000003);
        iret[3] = pthread_create( &threads[3], NULL, Pass2, 3000000003);
        pthread_join( threads[0], NULL);
        pthread_join( threads[1], NULL);
        pthread_join( threads[2], NULL);
        pthread_join( threads[3], NULL);

	//a.var1 *= 4;

	a.var1 = (1 + ( a.var1 + a.var2 + a.var3 + a.var4 ) ) * 4;

	//a.var1 = 1.7112233;

	//a.var1 = (1 - ( a.var1 ) )*4;

	//char test[500];
	//int empty;
	//empty = sprintf(test, "
	//double test = a.var1;
	
	int i;

	//for(i=0; i<4; i++){


	//a.var3 = .12;
	//a.var2 = .13;
	//a.var1 = a.var3 + a.var2;
	printf("%.32Lf\n\n", a.var1);
	//}
	printf("size: %lu\n",sizeof(long double));


	return(0);
}


	/*	for(counter1 = 9990; counter1 < 9999; counter1++){
		printf("%d: %d\n", counter1, digits[counter1]);
	}
	*/

void Pass1(register unsigned char digits[10000], register int totals[10]){
	int counter1;
	int sum1 = 0;
	for(counter1 = 0; counter1 < 9999; counter1++){
		sum1 += digits[counter1];
		//printf("%d: %d\n", counter1, digits[counter1]);
		if(digits[counter1]==0){
			totals[0]++;
		}else if(digits[counter1]==1){
			totals[1]++;
		}else if(digits[counter1]==2){
			totals[2]++;
		}else if(digits[counter1]==3){
			totals[3]++;
		}else if(digits[counter1]==4){
			totals[4]++;
		}else if(digits[counter1]==5){
			totals[5]++;
		}else if(digits[counter1]==6){
			totals[6]++;
		}else if(digits[counter1]==7){
			totals[7]++;
		}else if(digits[counter1]==8){
			totals[8]++;
		}else if(digits[counter1]==9){
			totals[9]++;
		}else{
			printf("error\n");
		}
	}
	printf("sum: %lu\n", sum1);
	printf("avg: %lf\n", (double)sum1/9999);

	for(counter1=0; counter1<10; counter1++){
		printf("%d: %d\n", counter1, totals[counter1]);
	}

}

void Pass2(long int digits){

	
	register double pi = 0;
	//double x;
	register double counter1, counter2, counter3;

	counter2 = 1;
	counter3 = digits;


	for(counter1 = 0; counter1 < 250000000 ; counter1++){



		pi -= ( 1/counter3 );
		pi += ( 1/(counter3+2) );
		counter3+=4;



		//counter1+=2
		//pi += ( 1/counter1 );
		//counter2 *= -1;

		//pi = pi + (1/(counter1));
/*		counter2+=2;
		pi = pi + (1/(counter2));
		counter2+=2;
                pi = pi - (1/(counter2));   
		counter2+=2;
                pi = pi + (1/(counter2));
		counter2+=2;
                pi = pi - (1/(counter2));
		counter2+=2;   
                pi = pi + (1/(counter2));
		counter2+=2;
*/
		//counter2 = counter2 + 4;
		//= 1 - (1/3) + (1/5) - (1/7) + (1/9) - (1/11);
	}


	//pi = pi * 4;	
	//printf("pi: %0.16f\n", pi);
	//a.var1 += pi;

	if(digits == 3){
		a.var1 = pi;
	}else if(digits == 250000003){
		a.var2 = pi;
	}else if(digits == 500000003){
		a.var3 = pi;
	}else{
		a.var4 = pi;
	}


}


void Pass3(long int digits){

                
        register double pi = 0;
        //double x;
        register double counter1, counter2, counter3;
                
        counter2 = 1;
        counter3 = digits + 250000000;   
                
                
        for(counter1 = digits; counter1 < counter3; counter1+=4){
  
                pi -= ( 1/counter1 );
                pi += ( 1/counter1+2 );
	}
}

void Pass4(long int digits){
                
                
        register double pi = 0;
        //double x;
        register double counter1, counter2, counter3;

        counter2 = 1;
        counter3 = digits + 250000000;


        for(counter1 = digits; counter1 < counter3; counter1+=4){
        
                pi -= ( 1/counter1 );
                pi += ( 1/counter1+2 );
        }
}               

void Pass5(long int digits){
                
                
        register double pi = 0;
        //double x;
        register double counter1, counter2, counter3;

        counter2 = 1;
        counter3 = digits + 250000000;


        for(counter1 = digits; counter1 < counter3; counter1+=4){
        
                pi -= ( 1/counter1 );
                pi += ( 1/counter1+2 );
        }
}               

