无法用operator<<输出std::float128_t,如何无第三方库打印该类型?
问题解答
关于扩展浮点类型的支持度问题
你没有理解偏差,cppreference的信息并非错误,但GCC 13配套的libstdc对C23扩展浮点类型的支持并不完整。
P1467R9提案不仅定义了std::float128_t这类标准类型别名,还要求标准库提供对应的IO操作、数学函数等配套支持。但GCC 13的libstdc++仅完成了类型别名的实现,并未添加std::ostream针对std::float128_t的operator<<重载。
编译时出现的歧义错误,本质是因为std::float128_t的底层类型_Float128可以隐式转换为多个整数类型,而编译器找不到匹配的浮点型输出重载,因此抛出歧义错误。
不借助第三方库打印std::float128_t的方法
方法1:利用GCC内置的printf支持
GCC对__float128(与_Float128/std::float128_t兼容)提供了printf系列函数的支持,使用%Lf作为格式说明符即可:
#include <iostream> #include <cstdio> #include <stdfloat> int main() { std::float128_t num = 1.2345678901234567890123456789; std::printf("%Lf\n", static_cast<__float128>(num)); // 如需更高精度,可指定小数位数,例如%.30Lf std::printf("%.30Lf\n", static_cast<__float128>(num)); }
方法2:自定义ostream的operator<<重载
如果希望沿用std::cout的语法,可以手动实现对应的输出重载,底层借助snprintf完成格式化:
#include <iostream> #include <stdfloat> #include <cstdio> std::ostream& operator<<(std::ostream& os, std::float128_t val) { char buffer[256]; // 可根据需求调整格式,例如科学计数法用%Le std::snprintf(buffer, sizeof(buffer), "%.20Lf", static_cast<__float128>(val)); return os << buffer; } int main() { std::cout << std::float128_t{1} << '\n'; std::cout << std::float128_t{3.141592653589793238462643383279} << '\n'; }
内容的提问来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

