计算sinh的泰勒级数
Calculation the Taylor series of sinh
该函数使用以下公式计算 sinh(x)
的值
泰勒级数的发展:
我想计算 sinh(3) = 10.01787 的值,但函数输出 9。我也收到此警告:
1>main.c(24): warning C4244: 'function': conversion from 'double' to 'int', possible loss of data
这是我的代码:
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
,因为您是从函数返回它并对其执行数学运算 with/on。
请记住,将 double
除以 int
会得到 double
。
编辑:根据 ringø 的评论,看看它实际上是如何解决你的问题的,你还应该设置 double fattoriale(int n)
并在 double risultato = 1;
.
里面
您正在失去精度,因为许多项都是小数。使用 int
会破坏小数部分。根据需要将 int
类型替换为 double
类型。
您的阶乘函数将溢出 n
的非常小的值。对于 16 位 int
,n
的最大值是 7,对于 32 位,它是 12,对于 64 位,它是 19。溢出 signed
整数类型的行为是 未定义。如果您的编译器支持,您可以使用 unsigned long long
或 uint128_t
。那会给你争取更多的时间。但是考虑到您无论如何都要转换为 double
,您也可以使用 get-go 中的 double
。请注意,IEEE764 浮点双精度数将在 171 处达到无穷大!
确保 sinh
的麦克劳林展开的收敛半径对于 x
的 任何 值是无限的。因此 x
的任何值都可以工作,尽管收敛速度可能很慢。见 http://math.cmu.edu/~bkell/21122-2011f/sinh-maclaurin.pdf.
该函数使用以下公式计算 sinh(x)
的值
泰勒级数的发展:
我想计算 sinh(3) = 10.01787 的值,但函数输出 9。我也收到此警告:
1>main.c(24): warning C4244: 'function': conversion from 'double' to 'int', possible loss of data
这是我的代码:
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
,因为您是从函数返回它并对其执行数学运算 with/on。
请记住,将 double
除以 int
会得到 double
。
编辑:根据 ringø 的评论,看看它实际上是如何解决你的问题的,你还应该设置 double fattoriale(int n)
并在 double risultato = 1;
.
您正在失去精度,因为许多项都是小数。使用
int
会破坏小数部分。根据需要将int
类型替换为double
类型。您的阶乘函数将溢出
n
的非常小的值。对于 16 位int
,n
的最大值是 7,对于 32 位,它是 12,对于 64 位,它是 19。溢出signed
整数类型的行为是 未定义。如果您的编译器支持,您可以使用unsigned long long
或uint128_t
。那会给你争取更多的时间。但是考虑到您无论如何都要转换为double
,您也可以使用 get-go 中的double
。请注意,IEEE764 浮点双精度数将在 171 处达到无穷大!确保
sinh
的麦克劳林展开的收敛半径对于x
的 任何 值是无限的。因此x
的任何值都可以工作,尽管收敛速度可能很慢。见 http://math.cmu.edu/~bkell/21122-2011f/sinh-maclaurin.pdf.