Эффективное преобразование boost::multiprecision::cpp_dec_float_100 в std::строку?

#c #c 11 #boost

Вопрос:

Проблема

У меня есть вектор, содержащий cpp_dec_float_100 значения из boost::multiprecision библиотеки (т. Е. an std::vector<cpp_dec_float_100> ). Моя цель-преобразовать это в an std::vector<std::string> (т. Е. Преобразовать cpp_dec_float_100 типы в string s).

Что я пробовал

  • boost::exception::to_string() / boost::lexical_cast<std::string> : Boost предоставляет некоторые встроенные инструменты для преобразования типов Boost в std::string . К сожалению, для этого cpp_dec_float требуется высокая точность, чего недостаточно для моих целей. Например, 1545596569.76676355 становится 1.5456e 09 . Если бы я, например, записал это в файл с помощью ostream , я бы сохранил полную точность.
  • std::stringstream Подход: в собственной документации Boost говорится:

Для более сложных преобразований, например, когда точность или форматирование требуют более строгого контроля, чем предусмотрено поведением lexical_cast по умолчанию, рекомендуется использовать обычный подход std::stringstream.

То есть, это:

       // std::vector<cpp_dec_float_100> my_vector
      // contains my data set

      std::ostringstream ss;
      std::vector<std::string> my_vector_of_string;

      for(int i = 0; i < my_vector.size()-1;   i){
        ss << setprecision(n) << my_vector[i];
        my_vector_of_string.push_back(ss.str());
      }

 

Это работает (и, что не совсем удивительно, дает ту же точность, которую я получаю при записи в файл). Однако (опять же, не совсем удивительно), это невероятно медленно (на самом деле, непрактично, поэтому мои цели) медленно. Мой набор данных включает от десятков до сотен миллионов элементов.


Существует ли более эффективный метод преобразования a cpp_dec_float_100 в std::string ? Меня беспокоит только время, затраченное на это.

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы или если я упустил что-то важное. Я не очень хорошо знаком с повышением или c .

Комментарии:

1. Рассмотрим libfmt, повышение кармы или действительно stringstream , но оптимизированный путем повторного использования.

2. Я совершенно не понимаю, в чем заключается настоящая задача. Я не могу представить себе реальный случай использования, когда вам нужно было бы десятично отформатировать 10 000 000 чисел, но НЕ в файл, а в … вектор строк?

3. На самом деле, если вы можете поделиться программой, содержащей sef, для оптимизации, я оптимизирую ее для вас. Но убедитесь, что образец соответствует вашему требуемому варианту использования, иначе это пустая трата времени

4. @sehe Спасибо за предложения и предложение! Да, это необычная ситуация. По сути , я взаимодействую между функцией, которая обязательно выводит a vector of cpp_dec_float_100 , и функцией, которая записывает данные в собственный формат файла и должна быть передана a vector of string . Я попробую ваши предложения и составлю автономную программу.

5. Похоже, что проприетарная запись формата файла (интерфейс) является реальной проблемой. Похоже, что самым большим выигрышем было бы избежать выделения вектора строк. Если у вас есть этот код, я, вероятно, смогу сделать то же самое.