[英]How to disable printing of "-nan" from fmt
我正在努力将一些软件转换为使用 fmt 库,该库以前结合使用double-conversion
、 iostream
和boost::format
。 大多数数值 output 是双精度浮点数,我们有许多测试来检查涉及无穷大、nan 等的极端情况。
我的问题是,使用 fmt,许多测试输出已更改为显示负数而非数字: -nan
,这对我来说完全是无意义的概念。
我意识到 IEEE-754 规范允许nan
的大量不同位表示,包括设置或清除的符号位。 但我只想知道一个值是否是数字。 一旦值为nan
,我不在乎是否有人试图否定该值。 对nan
的任何算术结果都应该是nan
。 负号没有增加任何有意义的值。
那么在使用 libfmt 时如何省略double
-nan
值的负号呢?
我最终为双打制作了一个包装器 class 并为其定义了一个自定义formatter
,这解决了我遇到的问题。
#include <cmath> // for std::isnan
struct Numeric {
Numeric() = default;
Numeric(double d) : value(d) { }
double value = 0.0;
};
template <> struct fmt::formatter<Numeric> : fmt::formatter<double> {
// parse function inherited from formatter<double>
template <typename FormatContext>
auto format(const Numeric& n, FormatContext& ctx) const -> decltype(ctx.out()) {
return std::isnan(n.value) ?
fmt::format_to(ctx.out(), "nan") : // avoid output of "-nan"
formatter<double>::format(n.value, ctx); // otherwise use inherited format function
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.