Jump to content

cálculo do valor de PI usando Leibniz (num intervalo de tempo)


Flames
 Share

Recommended Posts

Escreva um programa que dado um intervalo de tempo em segundos, definido pelo utilizador durante a execução, utilize a série de Gregory-Leibniz para calcular o valor aproximado de PI...

Notas :

deverá utilizar a função time(NULL), disponível com a inclusão do ficheiro time.h

Fiz da seguinte forma mas acho que está errada segue-se o codigo

#include <stdio.h>
#include <time.h>
#include <math.h>
double lieb(unsigned int maximo);
int main() {
    unsigned int maximo;
    double x;

    printf("Tempo a decorrer\n");
    scanf("%d", &maximo);
    printf("Pi = %f", lieb(maximo));
return 0;

}
double lieb(unsigned int maximo){
     clock_t inicio,fim;
    inicio=clock();
    double pi=0;
    int i=0;
    int p=1;
    int div=4.0;
    do{
        pi+=pow(-1,i)*div/p;
        i++;
        p=p+2;
        fim=clock();
       } while ((fim-inicio)/CLOCKS_PER_SEC<maximo);
    return pi;

}

Alguem me poderia dizer se esta é a forma correcta de usar o time ? :S

Link to comment
Share on other sites

O que é pedido é a funcao time(); tu estas a usar a funcao clock().

Mesmo que estejas a usar bem o clock() nao estas a fazer o exercicio de acordo com o enunciado.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

O que é pedido é a funcao time(); tu estas a usar a funcao clock().

Mesmo que estejas a usar bem o clock() nao estas a fazer o exercicio de acordo com o enunciado.

O prof falou numa relacao entre qualquer coisa(pelos vistos TIME) e Clocks_per_Second e no que pesquisei nao vi essa relacao :S

Link to comment
Share on other sites

seria essa a ideia original ... para usar o clocks é inválido pela simples razão que (se bem me lembro) retorna o tempo de processamento da aplicação.

o problema é que o tempo de processamento deixa de ser contabilizado quando o processador está ocupado a fazer outras cenas como dar atenção a outras aplicações ....

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

seria essa a ideia original ... para usar o clocks é inválido pela simples razão que (se bem me lembro) retorna o tempo de processamento da aplicação.

o problema é que o tempo de processamento deixa de ser contabilizado quando o processador está ocupado a fazer outras cenas como dar atenção a outras aplicações ....

#include <stdio.h>
#include <time.h>
#include <math.h>
double lieb(unsigned int maximo);
int main() {
    unsigned int maximo;
    double x;

    printf("Tempo a decorrer\n");
    scanf("%d", &maximo);
    printf("Pi = %f", lieb(maximo));
return 0;

}
double lieb(unsigned int maximo){
     time_t inicio,fim;
    inicio=time(NULL);
    double pi=0;
    int i=0;
    int p=1;
    int div=4.0;
    do{
        pi+=pow(-1,i)*div/p;
        i++;
        p=p+2;
        fim=time(&fim);
       } while (difftime(fim,inicio)<maximo);
    return pi;

}

Terminei com algo assim...

Link to comment
Share on other sites

O prof falou numa relacao entre qualquer coisa(pelos vistos TIME) e Clocks_per_Second e no que pesquisei nao vi essa relacao :S

Pois não 😉

Não há relação entre a função time() e a macro CLOCKS_PER_SEC.

A função time() está "ligada" ao tempo dum relógio de pulso.

A função clock() está "ligada" ao tempo do processo.

Pode haver grandes diferenças entre estes dois tempos principalmente em computadores com múltiplos processadores, e, em menor grau, quando o processador divide o tempo por vários processos.

        fim=time(&fim);

Terminei com algo assim...

Não está nada mal.

Mas tenho uma sugestões a fazer: a função time() mete o valor actual no argumento passado, se diferente de NULL, e devolve esse mesmo valor. Não é preciso atribuir esse valor duas vezes, ou seja, ou passas o fim como argumento, ou usas para atribuição.

        fim = time(NULL);
        time(&fim);

Além disso se puderes evitar a função pow() deixas de depender do header <math.h> e, provavelmente, tornas o cálculo mais rápido. Repara que só usas a função para alternar entre 1 e -1. Podes fazer o mesmo, por exemplo, assim

int i = -1;
    pi += i * 4.0 / p;
    i = -i; // troca sinal

Podes ainda passar o 4 para fora do ciclo. 4/1 - 4/3 + 4/5 - 4/7 + ... é o mesmo que 4*(1/1 - 1/3 + 1/5 - 1/7 + ...)

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Outra coisa!!

int main() {
    unsigned int maximo;
    /* ... */
    scanf("%d", &maximo);

O "%d" serve para introduzir valores de tipo int; o maximo é um objecto de tipo unsigned. Uma coisa não joga com a outra!!

Ou alteras o tipo da variavel maximo, ou alteras o formato no scanf (para "%u").

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Outra coisa!!

O "%d" serve para introduzir valores de tipo int; o maximo é um objecto de tipo unsigned. Uma coisa não joga com a outra!!

Ou alteras o tipo da variavel maximo, ou alteras o formato no scanf (para "%u").

Yap a parte do i tens razao pois eu estava a usa-lo de inicio para controlar o numero de ciclos que o utilizador queria (liebniz num outro formato)

#include <stdio.h>
#include <time.h>
double lieb(unsigned int maximo);
int main() {
    unsigned int maximo;
    double x;

    printf("Tempo a decorrer\n");
    scanf("%u", &maximo);
    printf("Pi = %f", lieb(maximo));
return 0;

}
double lieb(unsigned int maximo){
     time_t inicio,fim;
    inicio=time(NULL);
    double pi=0;
    int i=1;
    double p=1.0;
    do{
        pi+=i/p;
        p=p+2;
        i=-i;
        fim=time(NULL);
       } while (difftime(fim,inicio)<maximo);
    return 4*pi;

}

PS: a diferença de segundos não é significativa ou é impressão minha? um segundo dá 3.141593 o mesmo que segundo>=2 -.-"

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.