操作系统 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 中的不同结果的主要内容,如果未能解决你的问题,请参考以下文章
Qt 线程代码在 MAC、Linux 和 Windows 中的不同行为
gcc和msvc(或Linux和Windows)中的valarray有啥区别