[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[riminilug-general] Linguaggio C VS. Linguaggio D



Ciao a tutti amici, sono un po' malconcio... ma spero di potermi
rimettere per l'incontro di giovedi' sera.

Chiederei una cortesiuola a tutti. 
Allego due file alla presente (sono piccoli!! :) uno e' un sorgente in
linguaggio D "pi.d" (http://www.digitalmars.com/d/index.html) per
calcolare il pigreco ad un dato numero di cifre di precisione, uno e'
l'equivalente da me tradotto in C "pi.c" e compilato con gcc 3.3.3.
Sulla mia macchina (Athlon Barton 3.2+), i risultati con una precisione
di 10000 (diecimila) digit, sono stati i sequenti:
"pi" in C = 41 secondi
"pi" in D = 44 secondi

Mi piacerebbe che mi confermiate/confrontate queste divergenze, anche su
macchine meno spinte.
... perche' se lo scarto e' solo quello che si intuisce, considerando
che il D e' ancora giovincello, ... raga! qui il linguaggino di Bright
promette scintille! :-P

Grazie Ciao a tutti.
Gabriele

P.S. per downloadare il compilatore D scaricare da
ftp://ftp.digitalmars.com/dmd.zip

-- 
Gabriele Zappi <zappig@xxxxxxxxxxxx>
RiminiLUG
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>

/* Prototypes declaration */
void arctan(int s);
void add();
void sub();
void mul(int multiplier);
void mydiv(int divisor);
void div4();
void mul4();
int tiszero();

const int LONG_TIME=4000;

// byte[] p;
// byte[] t;
char *p;
char *t;
int q;

int main(int argc, char *argv[])
{
	int startime, endtime;
	int i;
	struct timeval tv;
	//struct timezone *tz;

	if (argc == 2) {
		sscanf(&argv[1][0],"%d",&q);
	} else {
		printf("Usage: pi [precision]\n");
		exit(55);
	}

	//printf("debug: q = %d\n",q);

	if (q < 0)
	{
		printf("Precision was too low, running with precision of 0.\n");
		q = 0;
	}

	if (q > LONG_TIME)
	{
	    printf("Be prepared to wait a while...\n");
	}

	// Compute one more digit than we display to compensate for rounding
	q++;

	// p.length = q + 1;
	// t.length = q + 1;
	p=malloc((q+1)*sizeof(char));
	t=malloc((q+1)*sizeof(char));

	/* compute pi */

	//printf("debug: Starting to compute\n");
	//std.c.time.time(&startime);
	gettimeofday(&tv,NULL);
	startime=(int)tv.tv_sec;
	arctan(2);
	arctan(3);
	mul4();
	//std.c.time.time(&endtime);
	gettimeofday(&tv,NULL);
	endtime=(int)tv.tv_sec;

	// Return to the number of digits we want to display
	q--;

	/* print pi */

	printf("pi = %d.",(int)(p[0]));
	for (i = 1; i <= q; i++)
	printf("%d",(int)(p[i]));
	printf("\n");
	printf("%ld seconds to compute pi with a precision of %d digits.\n",endtime-startime,q);

	return 0;
}

void arctan(int s)
{
	int n;

	t[0] = 1;
	mydiv(s); /* t[] = 1/s */
	add();
	n = 1;
	do {
		mul(n);
		mydiv(s * s);
		mydiv(n += 2);
		if (((n-1) / 2) % 2 == 0)
			add();
		else
			sub();
	} while (!tiszero());
}

void add()
{
	int j;

	for (j = q; j >= 0; j--)
	{
		if (t[j] + p[j] > 9) {
			p[j] += t[j] - 10;
			p[j-1] += 1;
		} else
			p[j] += t[j];
	}
}

void sub()
{
	int j;

	for (j = q; j >= 0; j--)
		if (p[j] < t[j]) {
			p[j] -= t[j] - 10;
			p[j-1] -= 1;
		} else
			p[j] -= t[j];
}

void mul(int multiplier)
{
	int b;
	int i;
	int carry = 0, digit = 0;

	for (i = q; i >= 0; i--) {
		b = (t[i] * multiplier + carry);
		digit = b % 10;
		carry = b / 10;
		t[i] = digit;
	}
}

/* t[] /= l */

void mydiv(int divisor)
{
	int i, b;
	int quotient, remainder = 0;

	for (i = 0; i <= q; i++) {
		b = (10 * remainder + t[i]);
		quotient = b / divisor;
		remainder = b % divisor;
		t[i] = quotient;
	}
}

void div4()
{
	int i, c, d = 0;

	for (i = 0; i <= q; i++) {
		c = (10 * d + p[i]) / 4;
		d = (10 * d + p[i]) % 4;
		p[i] = c;
	}
}

void mul4()
{
	int i, c, d;

	d = c = 0;

	for (i = q; i >= 0; i--) {
		d = (p[i] * 4 + c) % 10;
		c = (p[i] * 4 + c) / 10;
		p[i] = d;
	}
}

int tiszero()
{
	int k;

	for (k = 0; k <= q; k++)
		if (t[k] != 0)
			return 0;
	return 1;
}



import std.c.stdio;
import std.c.stdlib;
import std.c.time;

const int LONG_TIME=4000;

byte[] p;
byte[] t;
int q;

int main(char[][] args)
{
	int startime, endtime;
	int i;

	if (args.length == 2) {
		sscanf(&args[1][0],"%d",&q);
	} else {
		printf("Usage: pi [precision]\n");
		exit(55);
	}

	if (q < 0)
	{
		printf("Precision was too low, running with precision of 0.\n");
		q = 0;
	}

	if (q > LONG_TIME)
	{
	    printf("Be prepared to wait a while...\n");
	}

	// Compute one more digit than we display to compensate for rounding
	q++;

	p.length = q + 1;
	t.length = q + 1;

	/* compute pi */

	std.c.time.time(&startime);
	arctan(2);
	arctan(3);
	mul4();
	std.c.time.time(&endtime);

	// Return to the number of digits we want to display
	q--;

	/* print pi */

	printf("pi = %d.",cast(int)(p[0]));
	for (i = 1; i <= q; i++)
	printf("%d",cast(int)(p[i]));
	printf("\n");
	printf("%ld seconds to compute pi with a precision of %d digits.\n",endtime-startime,q);

	return 0;
}

void arctan(int s)
{
	int n;

	t[0] = 1;
	div(s); /* t[] = 1/s */
	add();
	n = 1;
	do {
		mul(n);
		div(s * s);
		div(n += 2);
		if (((n-1) / 2) % 2 == 0)
			add();
		else
			sub();
	} while (!tiszero());
}

void add()
{
	int j;

	for (j = q; j >= 0; j--)
	{
		if (t[j] + p[j] > 9) {
			p[j] += t[j] - 10;
			p[j-1] += 1;
		} else
			p[j] += t[j];
	}
}

void sub()
{
	int j;

	for (j = q; j >= 0; j--)
		if (p[j] < t[j]) {
			p[j] -= t[j] - 10;
			p[j-1] -= 1;
		} else
			p[j] -= t[j];
}

void mul(int multiplier)
{
	int b;
	int i;
	int carry = 0, digit = 0;

	for (i = q; i >= 0; i--) {
		b = (t[i] * multiplier + carry);
		digit = b % 10;
		carry = b / 10;
		t[i] = digit;
	}
}

/* t[] /= l */

void div(int divisor)
{
	int i, b;
	int quotient, remainder = 0;

	for (i = 0; i <= q; i++) {
		b = (10 * remainder + t[i]);
		quotient = b / divisor;
		remainder = b % divisor;
		t[i] = quotient;
	}
}

void div4()
{
	int i, c, d = 0;

	for (i = 0; i <= q; i++) {
		c = (10 * d + p[i]) / 4;
		d = (10 * d + p[i]) % 4;
		p[i] = c;
	}
}

void mul4()
{
	int i, c, d;

	d = c = 0;

	for (i = q; i >= 0; i--) {
		d = (p[i] * 4 + c) % 10;
		c = (p[i] * 4 + c) / 10;
		p[i] = d;
	}
}

int tiszero()
{
	int k;

	for (k = 0; k <= q; k++)
		if (t[k] != 0)
			return false;
	return true;
}