【发布时间】:2019-03-18 16:27:58
【问题描述】:
我正在尝试按照this question 中的建议在 gcc 下启用软件浮点,但我遇到了障碍:
-msoft-float 标志导致:
/usr/include/c++/4.8.2/bits/basic_string.h: In function ‘long double std::stold(const string&, std::size_t*)’:
/usr/include/c++/4.8.2/bits/basic_string.h:2857:47: error: x87 register return with x87 disabled
stold(const string& __str, size_t* __idx = 0)
^
和 -mno-sse 原因:
/usr/include/c++/4.8.2/bits/basic_string.h: In function ‘float std::stof(const string&, std::size_t*)’:
/usr/include/c++/4.8.2/bits/basic_string.h:2849:46: error: SSE register return with SSE disabled
stof(const string& __str, size_t* __idx = 0)
^
有一个couple of questions 提到了这个错误,但与内核编程有关,这没有帮助。
basic_string 中发生的只是函数返回浮点数或双精度数。为什么会导致编译失败?
更重要的是,我能做些什么呢?
背景
我发现 C++ 应用程序在两个不同平台上的行为有所不同:
- Intel(R) Xeon(R) CPU E5504
- Intel(R) Core(TM) i5-3470 CPU
在任何一台机器上本地编译的代码在另一台机器上运行,但 对于一项测试,行为取决于代码在哪台机器上运行。
澄清 在机器 A 上编译的可执行文件在复制到机器 B 上运行时,其行为类似于在机器 B 上编译的可执行文件,反之亦然。
它可能是一个未初始化的变量或许多其他东西,但是 我怀疑原因可能是浮点的非便携式使用。 也许一台机器对浮点程序集的解释与另一台机器不同? 我想检验我的假设。 我想如果我可以强制程序使用(理想情况下严格的 IEE 754)软件浮点,它可能会确认或排除这一点。 它不是我的代码,我不想完全重写它来测试它。不过重新编译没问题。
与此相关,我问了一个单独的问题how-to-detect-differences-in-floating-point-behaviour-across-platforms 从另一方解决问题。
【问题讨论】:
-
尝试使用
-ffp-mode=full或-fno-fast-math进行编译。这应该强制严格遵守 IEEE754。 -
我试过 -fno-fast-math 但没有明显区别。我的平台上的 gcc 4.8 中没有 -ffp-mode 选项。我认为这可能特定于另一个编译器或平台。
-
我有另一个与此相关的古怪想法,请参阅emulator-to-run-an-application-as-if-its-on-a-different-cpu
标签: c++ gcc floating-point