Enrere Mòdul 4
Fonaments de Programació. Llenguatge C/C++---
Pràctica  Resum teòric Exercicis
Pràctica d'ampliació Annex: la depuració

 
Fórmula de Wallis. Obtenció del nombre p

Aquesta fórmula del càlcul avançat permet tenir una expressió molt senzilla per al número p.  No obstant, s'ha de considerar un nombre considerable de termes per tal que l'aproximació sigui bona. L'interès d'aquest programa no està tant en el càlcul del número p com en l'implantament de l'algoritme recursiu que permet aquest càlcul.

 

Desenvolupament de la pràctica

Una fórmula interessant i que es pot deduir amb eines avançades de càlcul és la fórmula de Wallis, que permet tenir una expressió del número p a partir d'aquests productes:

A pesar de la senzillesa de la fórmula, no és aquesta una bona forma d'aproximar el número p, ja que aquesta sèrie de factors convergeix molt lentament, el que equival a dir que fa falta molts factors per tal de tenir una aproximació acceptable del número p.

Creeu un nou arxiu font C anomenat m4p03.c. i escriviu el següent codi:

 

//m4p03.c - Fórmula de Wallis -

 

#include <stdio.h>

#include <stdlib.h>

 

double wallis(int n);

 

int main(){

    int n;

    printf("introduïu el valor de n\n");

    scanf("%d",&n);

    printf ("pi = %lf\n",wallis(n));

    return 0;

}

 

 

double wallis(int n){

 

    if (n==1) return 4;              //4=2·2

    if (n%2) return double(n+1)/double(n)*wallis(n-1);

    return double(n)/double(n+1)*wallis(n-1);

}

 

Captura de l'execució del programa.

 

 

Explicació del programa

El càlcul es fa amb la funció recursiva wallis(n), on n indica el nombre de factors que es consideraran (sense comptar el primer 2).

En el cas trivial, és a dir, quan n=1, tindrem wallis(1)=4

wallis(2)=2/3*wallis(1)=2/3*4

wallis(3)=4/3*wallis(2)=4/3*2/3*4

En la definició d'aquesta funció es pot comprovar que el càlcul es fa de forma diferent segons sigui n un nombre senar o parell. En el cas que n sigui senar (n%2=1) fa:

wallis (n) = (n+1)/n * wallis (n-1)

i en el cas que n sigui parell (n%2=0) fa:

wallis (n) = n/(n+1) * wallis (n-1)

double wallis(int n){

 

    if (n==1) return 4;              //4=2·2

    if (n%2) return double(n+1)/double(n)*wallis(n-1);

    return double(n)/double(n+1)*wallis(n-1);

}