问题是,循环的每个步骤都使用上一步骤的计算.此外,计算之间的差异仅在第100,000次迭代(约30万次)之间变得明显.
注意:我正在使用“格式(25)”将C程序的输出与Scilab 5.5.2的输出进行比较.命令.意思我正在比较25个有效数字.我还想指出,我明白如何在一定数量的位之后无法保证精度,但是在评论之前,请阅读以下部分.到目前为止,这两种语言之间的所有计算都是相同的,最多可达25位数.
试图达到这个问题的底线,到目前为止我已经尝试过:
>检查正在使用的数据类型:
我已经设法确认Scilab正在使用IEEE 754双打(根据语言文档).此外,根据维基百科,C不需要使用IEEE 754进行双打,但从我可以看出来,无论我在C中使用了两倍,都完全符合Scilab的结果.
>检查超验功能的使用:
我也从What Every Computer Scientist Should Know About Floating-Point Arithmetic读到,IEEE不需要超验功能来完全舍弃.考虑到这一点,我已经用这两种语言比较了这些函数(sin(),cos(),exp())的结果,结果看起来是相同的(最多25位数).
>使用其他功能和预定义值:
我重复使用sqrt()和pow()的上述步骤.以及Pi的值(我在C中使用M_PI,在Scilab中使用%pi).结果也是一样的.
>最后,我重写了循环(非常仔细),以确保两种语言之间的代码是相同的.
注意:有趣的是,我注意到,对于所有上述计算,两种语言之间的结果比计算的实际结果(浮点运算之外)更匹配.例如:
使用Wolfram Alpha的sin(x)值= 0.123456789 …..
使用Scilab& C = 0.12345yyyyy …..
即使一旦使用Scilab或C计算的值与实际结果(Wolfram)不同.每种语言的结果仍然相互匹配.这使我相信大部分的价值观是以同样的方式计算的(两种语言之间).即使IEEE 754不需要它们.
我原来的想法是上述前三点之一在两种语言之间实现不同.但是从我能说出的一切似乎都产生了相同的结果.
即使这些循环的所有输入都是相同的,结果可能不同吗?可能是因为一个非常小的错误(过去我可以看到25位数字)发生在一段时间内累积?如果是这样,我该如何解决这个问题?