Способ получить stringstream >> my_double под g ++, чтобы дать бесконечное значение или NaN? - PullRequest
3 голосов
/ 10 мая 2011

У меня есть функция c ++, которая принимает строковые данные.В этой функции я использую stringstream для извлечения double.

. Позже я проверяю, чтобы убедиться, что 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 выводить inf и nan на тестовой платформе, состоящей из g ++, под Ubuntu.

Таким образом, я хочу иметь возможность написать:

#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.

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Способ обработки зависит от реализации. Некоторые выводят «inf» или «NaN» в ostringstream, но воспринимают это как ошибку при входе. Я предлагаю вам сделать следующее:

  1. Проверьте, через ostringstream, что ваша реализация помещает в строку.
  2. Проверьте, возвращает ли ваш istringstream значения или рассматривает их как ошибку.
  3. Если они рассматриваются как ошибка, проверьте в своем методе from_text, получили ли вы "inf" или "NaN", и верните оттуда соответствующее значение.

К сожалению, если ваше программное обеспечение работает на нескольких платформах, вам может потребоваться код для конкретной платформы для обработки каждого случая.

Надеюсь, это поможет!

0 голосов
/ 10 мая 2011

Я думаю, что самый простой тест - это проверить, не является ли ret ненулевым, и (2 * ret! = Ret) для почти всех возвращаемых значений, которые сработают. Я имею в виду, кроме 2 specefic значений, которые являются максимальными и минимальными двойными значениями! и есть также класс std :: numeric_limits, который вы можете попробовать использовать.

...