计算sinh的泰勒级数

时间:2016-01-20 12:51:15

标签: c algorithm int double taylor-series

该函数使用以下函数计算sinh(x)的值 泰勒系列的发展:

sinh

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

  

1> main.c(24):警告C4244:'function':从'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);
}

请帮我修复这个程序。

2 个答案:

答案 0 :(得分:4)

编译器警告你这种数据丢失实际上非常棒 你看,当你这样称呼时:

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

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

将其更改为double esponenziale(double base, int esponente)risultato也应该是double,因为您要从函数返回它并使用/执行数学运算。

请注意,将doubleint分开后会为您提供double

编辑:根据ringø的评论,看看它是如何解决您的问题的,您还应该设置double fattoriale(int n)并在double risultato = 1;内。

答案 1 :(得分:3)

  1. 您正在失去精确度,因为许多术语都是小数量。使用interface IRunner extends NodeJS.EventEmitter {}将破坏小数部分。根据需要将int类型替换为int类型。

  2. 您的阶乘函数会因double的小值而溢出。对于16位nint的最大值为7,对于32位,它是12,对于64位,它是19。溢出{{1}的行为} integral type是 undefined 。如果您的编译器支持,您可以使用nsigned。这会给你带来更多的时间。但是,无论如何,只要您转换为unsigned long long,您也可以从一开始就使用uint128_t。请注意,IEEE764浮点双精度将达到无穷大,为171!

  3. 请确保double的Maclaurin扩展的收敛半径对于 double的任何值是无限的。所以sinh的任何值都会起作用,尽管收敛可能很慢。请参阅http://math.cmu.edu/~bkell/21122-2011f/sinh-maclaurin.pdf