繁体   English   中英

如何禁用 fmt 打印“-nan”

[英]How to disable printing of "-nan" from fmt

我正在努力将一些软件转换为使用 fmt 库,该库以前结合使用double-conversioniostreamboost::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM