Search code examples
calgorithmintdoubletaylor-series

Calculation the Taylor series of sinh


The function calculates the value of sinh(x) using the following development in a Taylor series:

sinh

I want to calculate the value of sinh(3) = 10.01787, but the function outputs 9. I also get this warning:

1>main.c(24): warning C4244: 'function': conversion from 'double' to 'int', possible loss of data

This is my code:

int fattoriale(int n)
{
    int risultato = 1;
    if (n == 0) 
    {
        return 1;
    }
    for (int i = 1; i < n + 1; i++) 
    {
        risultato = risultato * i;
    }
    return risultato;
}

int esponenziale(int base, int esponente) 
{
    int risultato = 1;
    for (int i = 0; i < esponente; i++) 
    {
        risultato = risultato * base;
    }
    return risultato;
}

double seno_iperbolico(double x) 
{
    double risultato = 0, check = -1;
    for (int n = 0; check != risultato; n++)
    {
        check = risultato;
        risultato = risultato + (((esponenziale(x, ((2 * n) + 1))) / (fattoriale((2 * n) + 1))));
    }
    return risultato;
}

int main(void) 
{
    double numero = 1;
    double risultato = seno_iperbolico(numero);
}

Please help me fix this program.


Solution

  • It is actually pretty great that the compiler is warning you about this kind of data loss.
    You see, when you call this:

    esponenziale(x, ((2 * n) + 1))
    

    You essentially lose your accuracy since you are converting your double, which is x, to an int. This is since the signature of esponenziale is int esponenziale(int base, int esponente).

    Change it to double esponenziale(double base, int esponente), risultato should be a double as well, since you are returning it from the function and performing mathematical operations with/on it.

    Remember that dividing a double with an int gives you a double back.

    Edit: According to ringø's comment, and seeing how it actually solved your issue, you should also set double fattoriale(int n) and inside that double risultato = 1;.