Como calcular senX - Algoritmo

Fala galera!
Estou fazendo um exercício em C mas com o foco em algoritmo.
O problema é o seguinte:

O valor de senx pode ser obtido com boa aproximação através dos 30 primeiros termos da série a seguir:
senx = x^1/1! - x^3/3! + x^5/5! - x^7/7! …
Construir um algoritmo que dado o valor de x, escrever quanto vale senx.

Bem, eu fiz a solução. O algoritmo compila, mas dar problemas no resultado: senX: -1.#INDOO

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

float calculaFatorial(int x) {
    int i;
    int fatorial = 1;

    for(i = 1; i <= x; i++) {
        fatorial *= i;
    }

    return fatorial;
}

int main() {

    //Contador dos 30 termos a serem calculados
    int i = 30;

    //Valores se seno de X e resultados dos operadores
    float senX = 0;
    float resultadoPositivo = 0;
    float resultadoNegativo = 0;

    float x;

    float contador1 = 1;
    float contador2 = 3;

    x = 45;

    while(i != 0) {

        resultadoPositivo = (pow(x, contador1)) / (calculaFatorial(contador1));
        resultadoNegativo = -((pow(x, contador2)) / (calculaFatorial(contador2)));
        contador1 += 4;
        contador2 += 3;
        i--;
    }

    senX = resultadoPositivo + resultadoNegativo;

    printf("SenX: %f", senX);

    return 0;
}

Alguém poderia me ajudar por favor?

Provavelmente seu problema está em tentar calcular o fatorial de números grandes (como 30). Os tipos primitivos (int, float) não são adequados para armazenar e calcular com números grandes (e o fatorial de 30 é um número beeeeem grande).

Abraço.

1 curtida

Agradeço o seu comentário meu amigo.
Tentei fazer em java, debuguei o programa manualmente e achei isso:

5.0
120.0
3125.0
120.0
1953125.0
120.0
1.220703125E9
120.0
Resultado! 1.0172526E7
5.0
120.0
3125.0
120.0
1953125.0
120.0
1.220703125E9
120.0
Resultado! 1.0172526E7
**SenX: 0.0**

O resultado que espero é o senX, e ainda encontro problemas. Você conhece alguma biblioteca que me ajuda com esses números grandes?
Sabe como posso usar?
É que nunca usei uma biblioteca na vida!

No caso do java, pode tentar com BigInteger e BigDecimal. Não sei quais as limitações exatas deles, mas são mais adequados para esses números grandes. No caso do C, não sei, mas acredito que haja soluções sim.

O tamanho dos tipos é um problema muito comum, presente em muitas linguagens (não digo todas pois não conheço todas). Outras linguagens podem conseguir trabalhar com números maiores, como Python.

Se é um exercício (e não é para entregar), considere isso como uma lição aprendida: há limitações na capacidade de armazenamento dos tipos.

Abraço.

1 curtida

Grupocodenome além dos problemas dos tipos primitivos que o TerraSkilll falou também tem alguns erros no seu código. Eu refiz aqui e deu pra calcular somente as 8 primeiras aproximações do valor de seno de 1.
Vamos aos erros:

  • Um dos erros do seu algoritmo está dentro do while. Os calculos das variáveis resultadoPositivo e resultadoNegativo você está perdendo, ficando armazenado somente o calculo atual.

  • Outro erro está na atualização da variável contador2 que está somando 3 o certo seria somar 4.

  • Altere também o tipo do parâmetro na função calculaFatorial para float, pois as variáveis contador1 e contador2 são do tipo float.

Segue o código alterado.

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

float calculaFatorial(float x) {
    int i;
    int fatorial = 1;
    
    for(i = 1; i <= x; i++) {
        fatorial *= i;
    }

    return fatorial;
}

int main() {

    //Contador dos 30 termos a serem calculados
    int i = 8;

    //Valores se seno de X e resultados dos operadores
    float senX = 0;
    float resultadoPositivo = 0;
    float resultadoNegativo = 0;

    float x;

    float contador1 = 1;
    float contador2 = 3;

    x = 1;
    
    while(i != 0) {

        resultadoPositivo += (pow(x, contador1)) / (calculaFatorial(contador1));
        resultadoNegativo += -((pow(x, contador2)) / (calculaFatorial(contador2)));
        contador1 += 4;
        contador2 += 4;
        i--;
    }

    senX = resultadoPositivo + resultadoNegativo;

    printf("SenX: %f\n", senX);
    return 0;
}

Abraço

1 curtida