计算sinh的泰勒级数

该函数使用Taylor系列中的以下开发来计算sinh(x)的值:

我想计算sinh(3)= 10.01787的值,但函数输出为9.我也得到这个警告:

1> main.c(24):警告C4244:'函数':从'double'转换为'int',可能丢失数据

这是我的代码:

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);
}

请帮我修复这个程序。


编译器警告你这种数据丢失实际上非常棒。
你看,当你调用这个:

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

由于您将double (即x )转换为int ,因此基本上会失去准确性。 这是因为esponenziale的签名是int esponenziale(int base, int esponente)

将它改为double esponenziale(double base, int esponente)risultato应该是double ,因为你正在从函数中返回它并使用/对其执行数学运算。

记住用int分割一个double会给你一个double回馈。

编辑:根据ringø的评论,并看到它如何真正解决你的问题,你应该设置double fattoriale(int n)并在double risultato = 1;


  • 由于许多术语都是分数量,因此您正在失去精确度。 使用int将打破小数部分。 根据需要用double类型替换您的int类型。

  • 你的阶乘函数会溢出n令人惊讶的小值。 对于16位intn的最大值是7,对于32位是12,对于64位,它是19.溢出有signed整型的行为是未定义的。 如果你的编译器支持它,你可以使用unsigned long longuint128_t 。 这会给你多一点时间。 但是,无论如何,如果你想转换成double ,那么你应该从一开始就使用double 。 请注意,一个IEEE764浮点加倍将在171处达到无穷大!

  • 可以肯定的是,对于任何x值, sinh的Maclaurin展开的收敛半径是无限的。 所以x任何值都可以工作,尽管收敛速度可能会很慢。 见http://math.cmu.edu/~bkell/21122-2011f/sinh-maclaurin.pdf。

  • 链接地址: http://www.djcxy.com/p/70985.html

    上一篇: Calculation the Taylor series of sinh

    下一篇: Working on code to calculate cosine with factorial sum