Перевод из QString в double[]
Быстрый перевод double в QString
Простой пример: int main(int argc, char *argv) < for (int i = 0; i 27
Этот точно не создаётся массив.
Я думаю, что ругань идёт не из-за преобразования строки в число, а из-за этого безобразия, которое мы видим.
Во-первых, размер массива должен быть точно известен на момент компиляции, при таком объявлении. Если у значения i могут быть варианты, то массив надо выделять через new. И уж точно, если строка содержит несколько чисел, то её надо разбить на подстроки, содержащие по одному числу, а потом уж в цикле заниматься преобразованием и присвоением полученных значений в массив. это в случае, если использовать методы QString. Если пользуешься strtod(), то внимательно изучи пример её использования.
Решение
Так метод data() использует QChar, а он не подходит для strtod
Честно, не понимаю как из QString в обычный char перевести
Добавлено через 10 минут
Спасите уже наконец глупого. 4 часа не могу данные из QString в первый элемент массива типа double запихнуть с учетом того, что в QString только числа могут быть.
Прадон, не доглядела.
А что тебе мешает преобразовывать методом QString::toDouble()?
На самом деле запрос в гугл «QString в char*» вывалит кучу ответов. Обычно, я начинаю запрос «qt » дальше суть вопроса. после двух-трёх вариантов вопроса ответ находится. Главное, правильно сформулировать вопрос.
Добавлено через 10 минут
И ещё вопрос до кучи, если результат работы NewDialog перерабатывается в массив чисел, то не проще ли сразу возвращать QList , а преобразование строки в double делать внутри диалога сразу же после ввода?
Не понял откуда вы взяли «list» «at(i)» и зачем ссылка на переменную bool?
(Точно уже не помню как там, но что-то в таком духе). И тут из любого типа данных можно перевести в integer, а если надо в string, то cstr, а в скобках то, какое значение Variable будет принимать после перевода, можно к примеру еще прибавить в них что-нибудь, или успеть перед изменением типа округлить и т.д.
Тут как-то не могу проследовать логику смены типов. Слава Богу вы хоть мне что-то объясняете простым русским языком, для меня простого смертного. Спасибо вам еще и еще раз.
К чему я VB сюды впихнул? Та вот, нельзя почему-то просто из QString в double перевести с помощью «saveInputData[i].toDouble» еще что-то нужно написать, а это еще что-то нужно понять. Эх. наверное за это я и люблю программирование. А низкоуровневый С++ мне нравится, хоть и куча всякого непонятного присутствует для меня.
Воспользовавшись вашим ответом и вашими подсказками написал так:
Быстрый перевод double в QString
200 млн инструкций и 39мс на выполнение.
Немного переписав QString::number() можно получить небольшой прирост:
180 млн инструкций и 38мс на выполнение.
Но теперь упираемся в _qdtoa, в котором вроде уже и выкинуть вроде бы нечего, ну и 35% на вставку нулей, точек, «-» и перевод char* в QString.
Есть ли какая нибудь возможность ускорить данную операцию? Ускорение в 2-а раза было бы замечательно.
Дополнительно вариант на бусте — очень медленно:
460 млн инструкций и 70мс на выполнение.
stringsteam и подобные еще хуже.
PS: тестировалось на Linux x86_64 + clang + valgrind + Qt4.
Перевод из QString в double[]
У меня есть массив и функция которая возвращает строку из QLineEdit. В этот список строк.
Преобразование double к qstring
Всем привет! Пишу программу, которая получает данные через API, а затем выводит их. Код разбора.
Преобразование double в QString
Здравствуйте! Возникла проблема с преобразованием double в QString. Вот участок кода: QString.
QString в Double не точная конвертация
Такой вопрос, делаю калькулятор. Введенное строка преобразуется в число формата double, но если.
На крайняк, можно просто написать чисто Сишную функцию перевода дубля в строку (опять же, типа char*), там можно убрать все накладные расходы sprintf (только точность задать) — это уже будет по порядку сравнимо с Asm. Если и этого мало, такую функцию не сложно и на Asm переписать (я, правда, его не знаю). Ну а дальше — только аппаратные ускорения.
Добавлено через 1 минуту
Все что до Asm-а — готов помочь
Увы.
300млн инструкций, 48 мс. Медленнее QString::number().
Переписав работу со строкой в doubleToStr на strcat/strcpy можно выжать еще + 5-10%, но этого все равно мало.
Попробую «на коленке».
Добавлено через 31 минуту
RazrFalcon, вот хотел сделать за несколько минут, но там есть подводные камешки, а время позднее, башка потрескивает и родня зовет к столу — Старый Новый Год встречать.
Вот начало (целую часть как-будто выделил, но ничего не проверял)
Нет. Экспонента не нужна.
Числа обычно в пределах 0.000001 — 10000.999999 + знак. В общем 4-5 знаков перед запятой, 3-8 после.
Добавлено через 2 часа 42 минуты
Собственно немного магии с округлением чисел и сдвигом запятой:
460 млн инструкций и 70мс на выполнение.
stringsteam и подобные еще хуже.
Байт, qt реализация вот.
Способ решения меня вообще мало волнует, главное производительность.
Dmitriy_M, -02
Я использовал QElapsedTimer, вместо time, отсюда и время в мс рядом с инструкциями.
Если верить тестам на реальной проге — то она ускорилась, так что valgrind не лжет, по крайней мере в этом случае (хотя на сколько я знаю количество инструкций не на прямую зависит от производительность).
Что значит для чего? Не уместный вопрос вообще. Мне нужно быстро перевести double в строку. Какая разница для чего, программа у меня такая.
Понятно. Чисто академическая задача.
Понятно. Чисто академическая задача.
Эхх. ну я как бы не новичок в программировании и знаю что делаю.
Приведу пример:
Есть текстовый файл в котором на каждой новой строчке по числу. Мне нужно прочесть файл, перевести все числа в double, обработать и сохранить обратно. Соответственно если у меня миллион строк — то перевод числа в строку будет вызван миллион раз. А если верить valgrind — это почти 60% времени работы проги.
Теперь понятна причина оптимизации?
+ Прога консольная, так что время ее работы ограничено только кодом, не каких внешних воздействий на нее нет. По этому важна каждая мс.
Добавлено через 10 минут
Вариант с переводом в double на лету:
А смысл? Программа запускается каждые пару секунд, к примеру. Так что кеш уже после первой 10-и запусков устаканится.
Да, согласен, при холодном старте результаты будут другие, но в процентном соотношении почти те же.
Да и суть не в этом. Запускаем прогу 100 раз и находим устаканившееся время работы. Теперь переводим в строку уже из uint, а это почти в два раза быстрее. И видим что calc начал возвращать значения в 2-а раза меньше. Значит вычисления ускорились в два раза. Дисковые кеши и прочее уже на это ни как не влияет.
Суть вопроса не в том как ускорить чтение файла и прочее, а конкретно перевод double в строку, так как именно это и является бутылочным горлышком, в данном случае.
Результаты холодного старта сразу после перезагруки ОС:
Быстрый перевод double в QString
200 млн инструкций и 39мс на выполнение.
Немного переписав QString::number() можно получить небольшой прирост:
180 млн инструкций и 38мс на выполнение.
Но теперь упираемся в _qdtoa, в котором вроде уже и выкинуть вроде бы нечего, ну и 35% на вставку нулей, точек, «-» и перевод char* в QString.
Есть ли какая нибудь возможность ускорить данную операцию? Ускорение в 2-а раза было бы замечательно.
Дополнительно вариант на бусте — очень медленно:
460 млн инструкций и 70мс на выполнение.
stringsteam и подобные еще хуже.
PS: тестировалось на Linux x86_64 + clang + valgrind + Qt4.
Перевод из QString в double[]
У меня есть массив и функция которая возвращает строку из QLineEdit. В этот список строк.
Преобразование double к qstring
Всем привет! Пишу программу, которая получает данные через API, а затем выводит их. Код разбора.
Преобразование double в QString
Здравствуйте! Возникла проблема с преобразованием double в QString. Вот участок кода: QString.
QString в Double не точная конвертация
Такой вопрос, делаю калькулятор. Введенное строка преобразуется в число формата double, но если.
Вывод в консоль что ли? Если да — то да, он дико медленный, но его нет, так как вывод идет только в файл.
Байт, спасибо, интересное решение. 12мс без перевода в QString и 15мс с ним + 70млн инструкций.
Я в свою очередь переделал свой вариант, и получил 9мс вместе с переводом в QString + 87млн инструкций.
Данный случай один из тех редких случаев, когда большее количество инструкций дало большую скорость =/
Данное решение в 4-е раза быстрее Qt-й реализации, пусть и с ограничениями. В принципе куда еще ускорять я не знаю, да и производительность уже и так довольно не плохая.
Собственно код (не самый очевидный, но работает верно):
Я вот что имел в виду. Известна ли точность ДО начала цикла. И сохраняется ли она на протяжении цикла. Тут нужна константа для округления = 0.5*10 prec . И вопрос — считать ли эту константу при каждом обращении к функции или можно установить разок и дальше уже ей пользоваться? Или может быть устанавливать достаточно редко, если числа можно разбить на группы одинаковой точности. Это все уже зависит от вашего алгоритма.
Добавлено через 6 минут
Может быть точность зависит от величины числа? Т.е. нужна относительная точность? Тогда можно задать набор констант. В общем здесь тоже есть возможности оптимизации.
Если я правильно понял вопрос — то нет. Функция перевода вызывается из разных частей программы и обычно с разным значением округления. То есть с любым в заданных пределах.
По поводу относительной точности, то:
1) 10.0001 можно считать как 10 при округлении в 3-4, так как дробная часть незначительна
2) 123.456000 можно записывать как 123.456 даже при точности в 6, так как эти нули не существенны
и тп.
то есть применяется округление дробной части до точность-1
Добавлено через 2 минуты
И нолик перед мелкими числами ставится легко. А то «-.0123» как-то корябало глаз.
Добавлено через 6 минут
Плюс: нет лонгов (long) которых может не хватить для больших double
Странно, всего 20млн инструкций, но 19мс времени выполнения + почему-то дико замедлится перевод в QString, с ним аж 96мс.
Видимо char char’у рознь. Приводил через QString::fromLatin1().
Мне кажется хитрость в том что мой вариант генерации строки, выдранный из сорцов кьюта, использует ushort, а не char. Но такая низкоуровневость — не моя область.
PS: да, нолик добавить не проблема, просто он мне не нужен.
fromLatin1 самый быстрый способ получения строки из char.
В любом случае спасибо. Теперь ясно что лучший способ — это хитрости с числами, а не строками.
В файл. Возможно у вас SSD, у которого запись происходит быстрее.
Не очень понятен смысл использования QString в чисто вычислительной программе. Каждый символ представлен двумя байтами и при записи в файл будет преобразования в UTF-8/одно байтовая кодировка.
Так. Перепроверил все с начала. В тестах потерялся нолик. Сначала было 100к запусков, потом почему-то стал уже миллион.
Собственно результаты (i5-3570k 3.4GHz + Gentoo Linux x86_64):
0) Результаты стандартных функций, на всех тестах идентичны, так как библиотеки то уже собраны
Результаты для clang разделил, так как при общем старте вариант от Байт почему-то замедляется, магия. на GCC такого не наблюдается.
Собственно извиняюсь перед Байт, криво посчитал. Его вариант получения char самый быстрый c компилятором clang. Если потом его переводить в QString — то производительность почти та же что и у моего варианта.
Надо попробовать скрестить эти варианты.
На GCC все уже совсем по другому. А еще говорят что Clang медленный (или это только про x86 архитектуру. ).
Собственно код тестов, если кто-то мне не доверяет:
Замена в QString медленнее, чем конкатенация. Он под это не заточен, в отличии от просто char[], у которого все в точности до на оборот.
По этому получаем 225мс без reserve(11) и 180 с ним. И с replace() вместо [] и reserve(11) — 137мс.
Что конечно же медленнее простого перевода char в QString.
В общем работая с Qt нужно побольше юзать ихние, оптимизированные методы, нежели стандартные сишные.
b.setCount(i); — не понял что это должно делать. Ну и QString &b, а не QString b. Мы же ссылку передаем, а не копию объекта.
Добавлено через 4 минуты
gng, 61мс и 94мс с переводом в QString на clang. На gcc -O2 чуть хуже. C -O3 вообще пишет 0мс.. и 37 с переводом в QString. Магия
Собственно те же результаты для QString что и у меня и Байта.
Видимо в main результат не используется. Вот оптимизатор и почистил
Можно еще пару ms выжать
Странные вещи в общем творятся. Не знаю что там оптимизатор навыдумывал, но в QString переводит же.
Ваш новый код работает идентично предыдущему. В пределах погрешности. На 2-3% лучше на 10млн прогонах.
Собственно на синтетике то ваш код лучше, а вот когда я его в своей проге использую то она начинает на 8% медленнее работать, чем мой вариант. С любым компилятором. Что заставляет задуматься.
В любом случае нужно проверять код на итоговой программе, а не на синтетике. Как минимум с моим вариантом моя прога работает в 2.5 раза быстрее чем с QString::number(). А значит профит есть.
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.
QString Не точно переводит в double
Всем привет, как в double перевести корректно QString data_double = «1.42542»; double.
Перевод из QString в Char
написала эхо сервер на с++. через терминал работает отлично. код клиента переписала на qt и.
Перевод char* to qstring
Всем доброго времени суток, подскажите как перевести из char* в qstring, именно так. Собственно я.
Перевод lpcstr to qstring
Здравствуйте, я получаю дескриптор проецируемого объекта: LPCTSTR pBuf; pBuf =.