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

Posted

技术标签:

【中文标题】操作系统 Windows 和 Linux 中的不同结果【英文标题】:Different results in OS Windows and Linux 【发布时间】:2013-12-05 19:58:07 【问题描述】:

我正在尝试在没有数学库的情况下计算 arkus sin()。它可以工作,但是在不同的平台上会产生不同的结果。

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;


【问题讨论】:

您可能应该标记正确的语言,也可能有助于了解每个操作系统是 32 位还是 64 位。 另外,请发帖SSCCE。我们需要整个程序来了解正在发生的事情。另外,请注意您运行它的确切平台(操作系统版本、硬件平台、处理器、编译器、编译器版本等...)。 顺便说一句,这很可能是浮点精度的问题。阅读floating point。请注意,有一个完整的科学分支致力于解决这些问题,Numerical Analysis。 这会产生未定义的行为,以下线程解释了原因。 ***.com/questions/4176328/… 【参考方案1】:

指令e = e * ((a * a) / ((++a) * (++a)) );会因为undefined behavior而产生不同的结果

您需要以这种方式更改您的代码:

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

尽管您需要使用替换线,直到它真正达到您希望的效果。

顺便说一句,这段代码很容易因编译器版本而异,而不仅仅是编译器品牌和操作系统。

【讨论】:

以上是关于操作系统 Windows 和 Linux 中的不同结果的主要内容,如果未能解决你的问题,请参考以下文章

Linux和Windows系统有什么不同?如何选择?

Qt 线程代码在 MAC、Linux 和 Windows 中的不同行为

gcc和msvc(或Linux和Windows)中的valarray有啥区别

Linux和WINDOWS有啥区别?

Windows与Linux操作系统对磁盘和文件的管理方式有啥异同点(求详细)

windows下jar无法在linux下运行