std::cout 在 armv7l 中为 float 或 double 变量打印 nan 或 zeros

std::cout printing nan or zeros for float or double variables in armv7l

我正在为 Raspberry PI 3B+ 编写 C++ 程序,使用 conan.io Docker 容器 conanio/gcc7-armv7 为 cross compilation 进行交叉编译。一切正常,直到我开始打印双精度值,并在输出中得到“nan”或错误值。我将我的代码简化为这个显示问题的最小示例:

#include <cstdio>
#include <iomanip>
#include <iostream>

int main() {
    double foo = 1.234567;
    float bar = 89.10121314;
    std::cout << std::fixed << std::setw(4) << std::setprecision(3) << "foo " << foo << '\n';
    std::printf("foo %4.2f\n", foo);
    std::cout << std::fixed << std::setw(4) << std::setprecision(3) << "bar " << bar << '\n';
    std::printf("bar %4.2f\n", bar);
}

我正在 x86_64 笔记本电脑 运行ning Ubuntu 20.04 上构建。当我在笔记本电脑上使用 gcc 9.3.0 和 运行 构建 x86_64 时,我得到了预期的输出:

foo 1.235
foo 1.23
bar 89.101
bar 89.10

但是当我在我的 Raspberry PI 中交叉编译和 运行 它时 std::cout 打印 -nan:

foo -nan
foo 1.23
bar -nan
bar 89.10

std::cout 不起作用,但 printf 工作正常。知道这是怎么回事吗?

谢谢

这通过将我用于交叉编译的 Docker 图像从 conanio/gcc7-armv7 更改为 conanio/gcc10-armv7hf 来解决。除了gcc版本(7.2.0 vs 10.3.0),它们之间的主要区别在于~/.conan/profiles/default,前者使用arch=armv7而后者使用arch=armv7hf,根据dpkg --print-architecture 是我应该使用的 Raspberry PI B+。

感谢@ted-lyngmo 提示尝试使用另一个编译器版本,感谢@eof 提示考虑浮点设置