2015-02-01 2 views
0

Как и название, как преобразовать double в строку в научной нотации быстрее, чем sprintf в C++?Преобразование double в строку в научной нотации быстрее, чем sprintf в C++

У меня есть много (около 1e10) двойных чисел, и вам нужно преобразовать все в строку в этом формате: ± *. ********* E ± ***, который имеет 10 значащих цифр.

Но sprintf и stringstream слишком медленны, есть ли более быстрый способ?

Спасибо.

+0

Вы пытались сравнить скорость, если strintf со скоростью sstream с выходными манипуляторами? Я полагаю, что sprintf быстрее :-) – VolAnd

+0

Конечно, 'sprintf' быстрее, чем' stringstream', но я хочу быстрее, чем 'sprintf'. – user1024

+0

Вы уверены, что sprintf слишком медленный? Если у вас удваивается, для чего вам нужны строки? Вы уверены, что это не операция, в которой вам нужна строка, для которой так медленно? – nvoigt

ответ

1

Использование форсирование выход

std::string str = boost::lexical_cast<std::string>(dbl); 

Нормальный подход:

std::ostringstream strs; 
strs << dbl; 
std::string str = strs.str(); 

Вы должны использоватьsprintf(), как это самый быстрый.

время работы различных функций @http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html

Ссылки: http://www.codeproject.com/Questions/166322/converting-number-from-long-double-to-string

Нужна помощь? Дайте мне знать

+0

Является ли 'boost' быстрее, чем' sprintf'? И я хочу, чтобы моя строка в этом формате: ± *. ********* E ± ***, которая имеет 10 цифр значения, как я могу это сделать? – user1024

+0

есть хорошая статья о производительности здесь http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html, sprintf быстрее –

+0

Итак, есть ли способ быстрее, чем ' sprintf'? – user1024

1

Преобразование, о котором вы просите, не является простой операцией. Вы можете посмотреть на How to implement " char * ftoa(float num) " without sprintf() library function in C, C++ and JAVA?.

Я не уверен, что вы найдете реализацию, которая будет быстрее, чем sprintf, потому что она находится в стандартной библиотеке C на время и уже может быть оптимизирована.

Лучшее, что вы можете сделать, это:

  • получить источник из стандартной библиотеки C
  • проанализировать, как преобразование выполняется
  • сравнить с сшивок в вопросе цитированной выше
  • бенчмарк различных реализаций

Я понимаю, что это скорее намек, чем полный ответ, но он тоже долго для комментария и лучшего, что я могу сделать

+0

Но я не смог найти существующую реализацию sprintf. После ввода кода я получил функцию '_cfltcvt_l', но в Windows не существует исходного кода' _cfltcvt_l'; в Linux я получил '__mingw_vsprintf', то же самое, никакого исходного кода. – user1024

Смежные вопросы