该函数使用以下函数计算sinh(x)
的值
泰勒系列的发展:
我想计算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);
}
请帮我修复这个程序。
答案 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
,因为您要从函数返回它并使用/执行数学运算。
请注意,将double
与int
分开后会为您提供double
。
编辑:根据ringø的评论,看看它是如何解决您的问题的,您还应该设置double fattoriale(int n)
并在double risultato = 1;
内。
答案 1 :(得分:3)
您正在失去精确度,因为许多术语都是小数量。使用interface IRunner extends NodeJS.EventEmitter {}
将破坏小数部分。根据需要将int
类型替换为int
类型。
您的阶乘函数会因double
的小值而溢出。对于16位n
,int
的最大值为7,对于32位,它是12,对于64位,它是19。溢出{{1}的行为} integral type是 undefined 。如果您的编译器支持,您可以使用n
或signed
。这会给你带来更多的时间。但是,无论如何,只要您转换为unsigned long long
,您也可以从一开始就使用uint128_t
。请注意,IEEE764浮点双精度将达到无穷大,为171!
请确保double
的Maclaurin扩展的收敛半径对于 double
的任何值是无限的。所以sinh
的任何值都会起作用,尽管收敛可能很慢。请参阅http://math.cmu.edu/~bkell/21122-2011f/sinh-maclaurin.pdf。