在Windows和Linux操作系统中出现不同的结果

3
我尝试在没有数学库的情况下计算arcsin()。它可以正常工作,但会在不同平台上产生不同的结果。 Windows和Mac(正确):5.2359877560e-001 Linux:5.1532736669e-01。 问题出在哪里呢?
double my_asin(double k)
{
    double x = k;
    double a = 1;
    double s = x;
    const  double hodnota = 0.00000000001f;
    double s1 = 0;
    double d = x;
    double e = 1.0;
    double y;
    y = x * x;


    while(my_abs(s1 - s) >= hodnota) {
        s1 = s;

        d = d * y;

        e = e * ((a * a) / ((++a) * (++a)) );
        s = s + (d * e);
    }

    return s;

}

2
你应该标记正确的语言,同时了解每个操作系统是32位还是64位可能会很有用。 - Alexandre Lavoie
另外,请发布一个SSCCE。我们需要整个程序来理解发生了什么。此外,请注意您在哪些平台上运行此程序(操作系统版本、硬件平台、处理器、编译器、编译器版本等)。 - sleske
顺便提一下,这很可能是浮点精度问题。请阅读有关浮点数的内容。请注意,有一个完整的科学分支专门研究这些问题,即数值分析 - sleske
这会产生未定义的行为,以下线程解释了原因。https://dev59.com/Zm855IYBdhLWcg3wuG-W - hetepeperfan
2个回答

9

操作指令e = e * ((a * a) / ((++a) * (++a)) );可能会产生不同的结果,因为存在未定义行为

你需要按照以下方式更改你的代码:

e *= a * a / ((a + 1) * (a + 2));
a += 2;

2

这行代码没有任何作用。

e = e * ((a * a) / ((++a) * (++a)) );

您需要将其中一个或两个增量移动到不同的一行。例如:

e = e * ((a * a) / ((a+2) * (a+1)) );
a+=2

尽管您需要调整替换行,直到它实际上做到您所希望的。

顺便说一下,这段代码可能会因编译器版本的不同而有所变化,不仅仅是编译器品牌和操作系统。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接