Serie de Leibniz en C/C++

En el Deitel & Deitel (Como programar en C/C++, Cap 4, pp. 143, versión en español de 1995), tenemos como ejercicio calcular el valor de pi (π) a partir de la serie infinita siguiente:

también denominada serie de Leibniz. En el referido ejercicio se pregunta cuantos términos de esta serie tendrá que utilizar antes de que empiece a tener 3.14; 3.141; 3.1415; 3.14159. Una propuesta de código podría ser la siguiente:

#include <iostream>
#include <cmath>
#include <fstream>
#include <iomanip>

using namespace std;

int main(){

	ofstream label1 ("salida.dat");

	long long int n;

	int i;

	double sum = 0;

	cout << "Numero de terminos de la serie = ? ";

	cin >> n;

	label1.setf(ios::fixed);
	label1.precision(10);

	cout.setf(ios::fixed);
	cout.precision(10);

	for (i=0; i < n; i++){

		sum = sum + pow(-1, i) * (4.0/ (2.0*i+1));

		//label1 << i+1 << " " << sum << "\n";

	}
	
	cout << sum << "\n";

	return 0;

}

Se emplea la posibilidad de imprimir una tabla que muestra el valor de π aproximado a un término de esta serie, a dos, a tres, etcétera; aunque en principio está “comentado” para usar el programa con un valor de términos de la serie verdaderamente muy grande y que sólo imprima el total por pantalla. Si usamos un n de, por ejemplo, 500.000, la respuesta al planteamiento inicial (con la posibilidad de imprimir una tabla) es de n = 627 para obtener 3.14, n = 2454 para obtener 3.141, n = 136.122 para obtener 3.1415 y n = 376841 para obtener 3.14159. El archivo de salida (salida.dat) pesa casi 10 MB con la información requerida y puede hacerse muy voluminoso a medida que el n sea mucho mayor. Por esta razón, sin la posibilidad de impresión en archivo, se determinó la aproximación de π para un n tan grande como 1000.000.000 y se ejecutó el programa. La salida, con time, fue:

Numero de terminos de la serie = ? 1000000000
3.1415926526

real	5m44.210s
user	5m33.745s
sys	0m0.000s

Si comparamos con el verdadero valor de π podemos ver que sólo las primeras 8 cifras decimales son correctas, es decir, que para esa precisión se requirió poco más de 5 minutos de ejecución en mi Quad de 4 núcleos. Mayores precisiones exigirán valores de n mucho mayores y tiempos de ejecución tal vez de varias horas. Mayor orientación al respecto la tendrán en el artículo de Wikipedia: Número π.

Esta entrada fue publicada en Código C++, Linux. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s