c – 如果符合IEEE 754的两种语言,这两种语言的计算结果会产生相同的答案?

前端之家收集整理的这篇文章主要介绍了c – 如果符合IEEE 754的两种语言,这两种语言的计算结果会产生相同的答案?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在将程序从Scilab代码转换为C.特别是一个循环产生的结果与原始的Scilab代码略有不同(这是一段长的代码,所以我不会把它包含在这个问题中,但是我会尽力总结下面的问题).

问题是,循环的每个步骤都使用上一步骤的计算.此外,计算之间的差异仅在第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位数字)发生在一段时间内累积?如果是这样,我该如何解决这个问题?

解决方法

不,编号系统的格式不能保证来自不同语言的功能的等效答案.

函数(如sin(x))可以使用相同的语言(以及不同的语言)以不同的方式实现. sin(x)函数是一个很好的例子.许多实现将使用具有插值的查找表或查找表.这具有速度优势.然而,一些实现可以使用泰勒级数来评估该功能.一些实现可以使用多项式来逼近近似.

具有相同的数字格式是解决语言之间的障碍.功能实现是另一个.

记住,您还需要考虑平台.使用80位浮点处理器的程序将会使用与使用64位浮点软件实现的程序不同的结果.

猜你在找的C&C++相关文章