如何在 g++ 下获取字符串流>> my_double以给出无限值或 NaN?
Way to get stringstream >> my_double under g++ to give an infinite value or NaN?
我有一个接受字符串输入的 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",但在进入过程中将其视为错误。我建议您执行以下操作:
- 通过 ostringstream 测试您的实现放入字符串的内容。
- 查看您的 istringstream 是否返回值或将其视为错误。
- 如果它们被视为错误,请在from_text方法中测试是否获得"inf"或"NaN",并从那里返回适当的值。
不幸的是,如果您的软件在多个平台上运行,则可能需要特定于平台的代码来处理每种情况。
希望这有帮助!
相关文章:
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- EASTL矢量<向量<int>>连续的
- 循环无限运行C++解决骑士之旅问题
- 过载'operator new'如何导致无限循环?
- 在Qt中实现无限可缩放的画布
- C++正则表达式无限循环
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 交换运算符 + 重载会导致无限递归
- 无限嵌套具有变体的地图
- 遍历链表时的无限循环
- 循环链表:无限循环
- 比较两个字符串后卡在无限循环中
- 在做一段时间内检查字符的无限循环
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 可能的无限循环
- 超出 int 的值范围后的无限循环
- 为什么这段代码会导致无限循环?
- 运行无限循环的最小二叉树问题
- USplineComponent Bounds SphereRadius 失败无限