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++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...