我在C中做了一个功课。我们必须用Taylor方法编写我们自己的asin()
函数,我们不能使用math.h
它工作正常,但是一旦我将iterations(int i)
的更高数量,它返回NaN
(非数字),当我使用i
的低数量时,数字不是精确。任何人都可以帮我这个吗?
double my_asin(double x)
{
int i = 0;
double vypocet = x;
double y = vypocet;
for(i=1;i<=10000;i++)
{
vypocet*=((x*x)*(2*i-1)*(2*i-1))/((2*i)*(2*i+1));
y+=vypocet;
}
printf("my_asin = %.10e\n", y);
return y;
}
编辑:谢谢大家!完了它:))
答案 0 :(得分:0)
你的答案需要两件事:
关于数学:你编码的系列扩展是一个sin逆(arcsin)并期望以弧度输出。
罪^( - 1)X = X + 1/6×^ 3 + 3 /(40)的x ^ 5 + 5 /(112)的x ^ 7 +(35)/(1152)的x ^ 9 + .. ......正如您所看到的,这是一个单调递增的扩展,并期望[-1,1]之间的值(输入)。插入大值时,例如10你必然得到你不期望的结果。所以,插入正确的值。我想,在调用函数my_asin()时输入正确的值[-1,1],你的代码可以正常使用你现在的迭代次数。
例如1.5146343691e + 000看起来很好90度或pi / 2或my_asin(1)。
2.Regarding Floating Point(双重即单精度浮点):它们不能表示实线上的所有数字,它们的范围是R的子集。当有一个无法正确表示的数字时他们的32位编码(IEEE 754)您将得到结果错误。 简单到0.1的数字不能用浮点精确表示。
检查这些页面是否存在FP错误和FP异常: