Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的asin()函数在使用更多迭代时返回NaN_C - Fatal编程技术网

C中的asin()函数在使用更多迭代时返回NaN

C中的asin()函数在使用更多迭代时返回NaN,c,C,我有一个C语言的作业。我们必须用泰勒方法编写自己的asin()函数,我们不能使用math.h 它工作得很好,但一旦我输入了较高的迭代次数(inti),它就会返回NaN(不是一个数字),当我使用较低的I,这个数字就不准确了。有人能帮我吗 double my_asin(double x) { int i = 0; double vypocet = x; double y = vypocet; for(i=1;i<=10000;i++) {

我有一个C语言的作业。我们必须用泰勒方法编写自己的
asin()
函数,我们不能使用
math.h

它工作得很好,但一旦我输入了较高的
迭代次数(inti)
,它就会返回
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;
}
my\u asin双倍(双倍x)
{
int i=0;
双vypocet=x;
双y=vypocet;

对于(i=1;i你的答案需要两件事:

  • 关于数学:您正在编码的级数展开是一个sin倒数(arcin),并期望以弧度为单位输出

    sin^(-1)x=x+1/6x^3+3/(40)x^5+5/(112)x^7+(35)/(1152)x^9+…正如你所看到的,这是一个单调递增的扩展,期望值(输入)仅在[-1,1]之间。当你插入大值,例如10,你一定会得到你不期望的结果。所以,插入正确的值。我猜,输入正确的值[-1,1]在调用函数my_asin()时,您的代码可以很好地适应现在的迭代次数

    e、 g 1.5146343691e+000在90度或pi/2或my_asin(1)下看起来很好

    2.关于浮点(双精度,即单精度浮点):它们不能表示实线上的所有数字,它们的范围是R的子集。当有一个数字不能用32位编码(IEEE 754)正确表示时,结果会出错。 像0.1这样简单的数字不能用浮点精确表示

    检查以下页面是否存在FP错误和FP异常:

  • 你的家庭作业不是教你如何写一个asin()函数,在math.h中有一个asin()函数是没有意义的。而是教你浮点数学是如何不准确的,以及它是如何错误的。现在你知道了。你能发布一些结果(预期的和错误的结果)吗有关一些输入值和一些迭代计数,请参见(案例3)--当你增加更多的迭代次数时,泰勒级数的命名和分母都接近无穷大;当被它自己除时,结果是NaN。事实上,你应该学会如何消除这种错误。注意:是一种浮点32位编码,精确表示0.1。