Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

dificuldade para fazer um somatório

Estava criando um programa para calcular valores aproximados de seno. Para isso, ele utiliza a série de Taylor pra função seno.

def fatorial(valor):
    fatorial = 1
    for valor in range(1, valor+1):
        fatorial *= valor
        valor -= 1
    return fatorial

def sin(valor_radianos):
    resultado = 0

    for n in range(0, 100):
        print(n)
        sinal = (-1)**n
        x = valor_radianos**(2*n+1)
        fator = fatorial(2*n + 1)

        resultado += (sinal*x)/fator

    return resultado

O que acontece é que para calcular valores do tipo float ele consegue realizar as operações até n = 85. Por exemplo, se der print(sin(1.57)) "metade de pi" ele mostra o erro "OverflowError: int too large to convert to float". Gostaria de saber como resolver isso e realizar quantas iterações de n eu puder.

1 resposta
solução!

Boa Tarde Adriano,

Isso acontece devido a algumas limitações do tipo float em Python, então quando você faz a conta 1.57**(2*85+1) o resultado dela é aproximandamente 3.15 * 10^33. O que é um valor em memória muito maior que o suportado pelo float do python e por isso el faz um overflow.

Para poder tornar viável o seu código você teria que usar a biblioteca decimal. Deixei o código aqui embaixo para você ver como seria, e se quiser deixei o código rodando no Repl.it

Fiz o teste com o valor que você passou de 1.57 e me retornou 0.9999996829318346587937423450032553101985683419381675024023446220678299347696966133098222104637836962 que é o seno(1.57). Então acho que está correto.

import decimal
decimal.getcontext().prec = 100 #seta a precisão para 100 casas

def fatorial(valor):
    fatorial = 1
    for valor in range(1, valor+1):
        fatorial *= valor
        valor -= 1
    return fatorial

def sin(valor_radianos):
    resultado = 0;

    valor = 1.57
    for n in range(100):
        sinal = (-1)**n;
        x = valor ** (2 * n + 1);

        fator = fatorial(2*n+1);

        resultado += (decimal.Decimal(sinal) * decimal.Decimal(x)) /decimal.Decimal(fator);
    return resultado;

Espero ter ajudado e bons estudos!