我可以执行哪些检查来确定它们在两个硬件平台的浮点行为中有什么不同?
验证IEE-754的遵从性或检查已知的bug可能就足够了(可以解释我观察到的输出的差异)。
我通过/proc/cpu查看了CPU标志,并且都声称支持SSE2:
但它们看起来很难使用。我已经构建了TestFloat,但我不知道该如何处理它。主页上写着:
不幸的是,TestFloat的输出并不容易理解。要负责任地使用TestFloat,就需要对IEEE有详细的了解。
理想情况下,我只想要一个或两个程序或一些简单的配置样式检查,我可以运行和比较两个平台之间的输出。
理想情况下,我会将其转换为配置检查,以确保在一个在配置时而不是在运行时异常行为的平台上编译非便携代码的尝试。
背景
我发现了C++应用程序在两个不同平台上的行为差异:
在这两台机器上本地编译的代码在另一台机器上运行,但是对于一种测试,其行为取决于在哪台机器上运行代码。
Clarification --在机器A上编译的可执行文件在复制到机器B上运行时,就像在机器B上编译的可执行文件一样,而visa则相反。
它可能是一个未初始化的变量(尽管在val研中什么都没有出现)或许多其他事情,但我怀疑原因可能是浮点的不可移植性的使用。也许一台机器对浮点程序集的解释不同于另一台机器?实施者已经证实他们知道这件事。这不是我的代码,我也不想完全重写它来测试它。不过,重新编译是可以的。我想验证我的假设。
在相关问题中,我正在研究如何启用软件浮点。这个问题是从另一个方面处理这个问题。
更新
我在配置检查的道路上尝试了以下基于@chux的提示。
#include <iostream>
#include <cfloat>
int main(int /*argc*/, const char* /*argv*/[])
{
std::cout << "FLT_EVAL_METHOD=" << FLT_EVAL_METHOD << "\n";
std::cout << "FLT_ROUNDS=" << FLT_ROUNDS << "\n";
#ifdef __STDC_IEC_559__
std::cout << "__STDC_IEC_559__ is defined\n";
#endif
#ifdef __GCC_IEC_559__
std::cout << "__GCC_IEC_559__ is defined\n";
#endif
std::cout << "FLT_MIN=" << FLT_MIN << "\n";
std::cout << "FLT_MAX=" << FLT_MAX << "\n";
std::cout << "FLT_EPSILON=" << FLT_EPSILON << "\n";
std::cout << "FLT_RADIX=" << FLT_RADIX << "\n";
return 0;
}在两个平台上提供相同的输出:
./floattest
FLT_EVAL_METHOD=0
FLT_ROUNDS=1
__STDC_IEC_559__ is defined
FLT_MIN=1.17549e-38
FLT_MAX=3.40282e+38
FLT_EPSILON=1.19209e-07
FLT_RADIX=2我还在找可能不一样的东西。
发布于 2019-03-22 16:32:27
OP有两个目标,有点冲突。
是的,有些差异很容易发现,但有些差异可能非常微妙。
对于一般问题,没有简单的测试。
建议之一是:
_STDC_IEC_559__,并希望这对您的应用程序来说足够了。考虑到其他各种因素,如FLT_EVAL_METHOD和FLT_ROUNDS以及优化级别,代码仍然可以兼容,但提供不同的结果,但是程度将更易于管理。https://stackoverflow.com/questions/55300378
复制相似问题