Eli*_*ias 5 c++ precision gcc g++
我在名为 test.cc 的文件中包含以下小型 C++ 代码:
#include <iostream>
int main() {
long double x = 3.3;
std::cout << x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
以正常方式编译(简单地 g++ test.cc)工作正常。
但是,当尝试使用 -mlong-double-128 选项时,存在链接问题:
$ g++ -mlong-double-128 test.cc
/tmp/cccKog5D.o: In function `main':
test.cc:(.text+0x1f): undefined reference to `std::ostream::operator<<(__float128)'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我尝试添加 -lquadmath 但问题仍然存在。
我用 g++ 5.4.0 和 6.1.0 版本尝试过此操作,两者的行为相同。
每当使用 << 运算符时,都可以通过强制转换为 double 来解决该问题,但我真的很想让它在不这样做的情况下工作。(背景是我有一个更大的研究代码,我希望能够使用 -mlong-double-128 进行编译以获得更高的精度,但由于这个问题而失败。)
关于如何解决这个问题有什么想法吗?
编辑:
现在我发现按照 @Niall 的建议使用 -mlong-double-128 重新编译 libstdc++ 库可以解决链接问题。
我下载了libstdc++源代码(gcc-6.1.0.tar.gz包的一部分)并配置如下:
../configure --enable-cxx-flags=-mlong-double-128 --prefix=/home/elias/slask/inst --disable-multilib
Run Code Online (Sandbox Code Playgroud)
然后,使用生成的 libstdc++.a 库文件,我可以构建我的 test.cc 程序,而不会出现任何链接错误:
g++ -mlong-double-128 test.cc /home/elias/slask/inst/lib64/libstdc++.a
Run Code Online (Sandbox Code Playgroud)
然而,当运行生成的可执行文件时,它无论如何都会给出错误的结果,它会打印“nan”而不是应有的 3.3。看起来它正在调用一些 glibc 例程来实际转换为字符串,但这不起作用,因为 glibc 不是使用 -mlong-double-128 编译的。我尝试使用 -mlong-double-128 重新编译 glibc,但这似乎不起作用。
编辑2:
我在 GCC bugzilla 页面中发现了这个相关问题:
Bug 43622 - 对 __float128 的 C++ 库支持不完整
从那里的评论来看,我想做的事情现在可能行不通,但可能在未来的版本中有效,至少这是一个已知的问题。
| 归档时间: |
|
| 查看次数: |
1528 次 |
| 最近记录: |