如何在 g++ 下获取字符串流>> my_double以给出无限值或 NaN?

Way to get stringstream >> my_double under g++ to give an infinite value or NaN?

本文关键字:gt 无限 NaN double 字符串 获取 my g++      更新时间:2023-10-16

我有一个接受字符串输入的 c++ 函数。 在函数中,我使用 stringstream 提取double

稍后,我检查以确保双精度不是 NaN 或无穷大。 但是,我无法提出一个测试输入,使提取运算符产生这些值中的任何一个。

这是我职能的重要部分。真正的用法是在某些类工厂方法中。

double from_text(const std::string& word, bool& failed){
  double ret; failed = true;
  std::istringstream param_in(word);
  if(!(param_in >> ret)) { 
    return ret; }
  if(is_nan_or_infinity(ret)) { 
    //I want to get here
    return ret; }
  failed = false; return ret;
}

你可能会说,如果你不能生产这个,何必呢?

我不想删除 if,因为我知道在某些实现中,例如 IBM 的实现,流运算符可以生成这样的值。

我不想忽略这个问题,因为我想在我的测试用例中至少获得 100% 的语句覆盖率,并且做出异常意味着我总是需要手动检查所有这些文件,以确保唯一未覆盖的行是我的例外。 手动检查意味着更多的错误。 现在只有五个文件使用像from_text这样的代码,所以这并非不可能,但我希望有更好的方法。

编辑

需要明确的是,我想要的是一种让std::istringstream(some_magic_string) >> my_double在 Ubuntu 下的 g++ 组成的测试平台上输出 inf 和 nan 的方法。

因此,我希望能够编写:

#include "test_stuff.hpp"
#include "from_text.hpp"
///Maybe more magic goes here
bool failed;
from_text("my_special_nan_producing_input",failed)
test_assert(failed,true,"NAN producing input causes failure");
from_text("my_special_inf_producing_input",failed)
test_assert(failed,true,"Infinity producing input causes failure");
///Clean up from all the special magic

并from_text执行由 ret 为 NaN 或 inf 而产生的分支。

处理此问题的方式似乎取决于实现。有些人会在 ostringstream 上输出"inf"或"NaN",但在进入过程中将其视为错误。我建议您执行以下操作:

  1. 通过 ostringstream 测试您的实现放入字符串的内容。
  2. 查看您的 istringstream 是否返回值或将其视为错误。
  3. 如果它们被视为错误,请在from_text方法中测试是否获得"inf"或"NaN",并从那里返回适当的值。

不幸的是,如果您的软件在多个平台上运行,则可能需要特定于平台的代码来处理每种情况。

希望这有帮助!