-
- еще в 1985, Phoenix Computer Products Corp. and Novum Organum, Inc. была написана целая библиотека, в том числе для конвертации данных в аски и работы со строками. Все что вам надо можно сделать без принтфа. Библиотекой могу поделиться. fprintf тяжел и неповоротлив. abivan(1547 знак., Сегодня, 21:02)
- Как-то так? Tahoe3A(342 знак., Сегодня, 19:16,
)
- Я так и делаю, но почему он сам не может? "%.3f" есть, а "%.3d"
нету... - Idler(Сегодня, 19:47)
- Ты главное в коде не заметил, это * и width. А %.3d нет по
очевидной причине, у "d" отсутствует дробная часть. - Tahoe3A(Сегодня, 20:40,
)
- Ну это только проблему с заменой нулей на пробелы помогает решить.
У меня на весь проект единственный раз понадобилось, обошел. А вот
"искусственная" дробная часть - в 90% случаев. Или хранить всё в
плавучке - память позволяет, или каждый раз делить при выводе. И
ещё - width задаёт минимальную длину. А в моих самописных функциях
- максимальную, и если число не лезет, оно заменяется на ####. А
лид.пробелы делаются установкой lead_zero=2 (1-нули, 0-ничего). - Idler(Сегодня, 21:11 - 21:20)
- А это единственная серьезная проблема. Все остальные, от
непонимания. Нет никакой "искусственной" дробной части. Нужна
дробная часть - есть float. Нужна дробная часть в рамках
целочисленных инструкций - бери Q-формат. Лишь бы собственные
нестандартные printf не изобретал. - Tahoe3A(Сегодня, 21:16,
)
- Ещё во времена ЕС-эвм мы писали "FORMAT +##.###" для вывода вполне
себе целочисленного числа. Это моё личное дело, как хранить число,
и как его понимать при выводе. Если я говорю, что это число "на
самом деле" - десятичное с ФИКСИРОВАННОЙ точкой и тремя знаками
после неё, то ЕС-ка "отдавала честь" и делала. А если нынче для
этого нужно преобразовать в плавучку и поделить - это комп должен
сам делать, не отвлекая меня на такие глупости. - Idler(Сегодня, 21:31)
- "Целочисленное, с тремя точками после", навеяло: Tahoe3B(19 знак., Сегодня, 21:47,
, ссылка)
- Какая-то каша в голове. Какая связь, между системой счисления
(десятеричной, двоичной - пофиг) и форматом представления int или
float? Что значит "я хочу", "я говорю"? Как математики придумали,
так и будет. И комп или язык программирования здесь никоим боком. - Tahoe3B(Сегодня, 21:43,
)
- "Целочисленное, с тремя точками после", навеяло: Tahoe3B(19 знак., Сегодня, 21:47,
- Ещё во времена ЕС-эвм мы писали "FORMAT +##.###" для вывода вполне
себе целочисленного числа. Это моё личное дело, как хранить число,
и как его понимать при выводе. Если я говорю, что это число "на
самом деле" - десятичное с ФИКСИРОВАННОЙ точкой и тремя знаками
после неё, то ЕС-ка "отдавала честь" и делала. А если нынче для
этого нужно преобразовать в плавучку и поделить - это комп должен
сам делать, не отвлекая меня на такие глупости. - Idler(Сегодня, 21:31)
- А это единственная серьезная проблема. Все остальные, от
непонимания. Нет никакой "искусственной" дробной части. Нужна
дробная часть - есть float. Нужна дробная часть в рамках
целочисленных инструкций - бери Q-формат. Лишь бы собственные
нестандартные printf не изобретал. - Tahoe3A(Сегодня, 21:16,
- Ну это только проблему с заменой нулей на пробелы помогает решить.
У меня на весь проект единственный раз понадобилось, обошел. А вот
"искусственная" дробная часть - в 90% случаев. Или хранить всё в
плавучке - память позволяет, или каждый раз делить при выводе. И
ещё - width задаёт минимальную длину. А в моих самописных функциях
- максимальную, и если число не лезет, оно заменяется на ####. А
лид.пробелы делаются установкой lead_zero=2 (1-нули, 0-ничего). - Idler(Сегодня, 21:11 - 21:20)
- Ты главное в коде не заметил, это * и width. А %.3d нет по
очевидной причине, у "d" отсутствует дробная часть. - Tahoe3A(Сегодня, 20:40,
- Я так и делаю, но почему он сам не может? "%.3f" есть, а "%.3d"
нету... - Idler(Сегодня, 19:47)
- printf("%.3f", 0.001 * V_DRN) вообще-то. Стоит ли из-за этого так
переживать? - SciFi(Сегодня, 18:42)
- "Партия и правительство" нас учит так не делать. В этом варианте
оба числа автоматически преобразуются в double, и процессор будет
пол-часа их перемножать. А в моём случае они грузятся в FPU, где
преобразуются и перемножаются за пару тактов. А для FPU умножать
или делить - пофиг. Можно ("%.3f", (double)((float)V_DRN *
0.001f)). - Idler(Сегодня, 18:55)
- Пожалуйста: printf("%.3f", 0.001f * V_DRN) - SciFi(Сегодня, 18:58)
- Я что, непонятно на прошлой строчке сказал? V_DRN без (float) будет
преобразован в (double), процессором, за тысячи тактов. И
умножаться будет процессором, еще дольше. FPU делает это меньше чем
за десяток тактов. - Idler(Сегодня, 19:04)
- Не будет. Вот: SciFi(1 знак., Сегодня, 19:05, картинка)
- Это фича свежего GCC. Вот IAR во всех вариантах: видно что первые 2
- целиком в FPU, вторые - процессорные, во много раз дольше. Idler(2117 знак., Сегодня, 19:30)
- У вас там ошибка: 0.001 вместо 0.001f. Дело не в Яре и не в GCC. - SciFi(Сегодня, 19:31)
- Достаточно добавить ключик "-fsingle-precision-constant", чтобы не
париться насчет того, что флоаты могут быть рассмотрены как double! - Eddy_Em(Сегодня, 19:54)
- Куда добавить? Это не GCC, у IARа никаких "ключиков" нет, есть
менюшки с настройками, из которых он сам генерит опции компилятора.
И теоретически, при определённом в настройках FPU "одинарной"
точности (поубивал бы переводчиков, нет такого слова, есть
"одиночной" и "оРдинарной" = "обычной"), мог бы выдавать
компилятору этот "ключик"... - Idler(Сегодня, 20:10)
- Намекаю, что пора бы на линукс перейти ☺ - Eddy_Em(Сегодня, 20:35)
- может еще предложишь с коробки "автомат" на "ручку" перейти? Мне
вот линукс вообще без надобности. Не испытываю никакого дискомфорта
на винде ни на работе, ни в быту. Не было ни одного софта которого
бы не было под винду. - abivan(Сегодня, 20:50)
- Да, на "ручку" тоже предложил бы. Сам на автомате ездил только пару
раз - на машине свояка. Не понравилось. По горным дорогам без
"ручки" очень хреново ездится (разве что, нонче есть тачки с
вариатором, где вручную можно повышать-понижать). Eddy_Em(215 знак., Сегодня, 22:05)
- офффтоп: если лично не пробовал "современный мёд" - то не стоит
говорить что "мёд/автомат" это говно. линукс - это боль , начиная с
документации. - Zoro(Сегодня, 22:35)
- Линукс - это здорово. Нужно лишь не пренебрегать чтением документации. Хотя, в маздае тоже юзеры не столь бы мучались, если б умели читать! Eddy_Em(576 знак., Сегодня, 22:40)
- офффтоп: если лично не пробовал "современный мёд" - то не стоит
говорить что "мёд/автомат" это говно. линукс - это боль , начиная с
документации. - Zoro(Сегодня, 22:35)
- Да, на "ручку" тоже предложил бы. Сам на автомате ездил только пару
раз - на машине свояка. Не понравилось. По горным дорогам без
"ручки" очень хреново ездится (разве что, нонче есть тачки с
вариатором, где вручную можно повышать-понижать). Eddy_Em(215 знак., Сегодня, 22:05)
- может еще предложишь с коробки "автомат" на "ручку" перейти? Мне
вот линукс вообще без надобности. Не испытываю никакого дискомфорта
на винде ни на работе, ни в быту. Не было ни одного софта которого
бы не было под винду. - abivan(Сегодня, 20:50)
- Намекаю, что пора бы на линукс перейти ☺ - Eddy_Em(Сегодня, 20:35)
- Куда добавить? Это не GCC, у IARа никаких "ключиков" нет, есть
менюшки с настройками, из которых он сам генерит опции компилятора.
И теоретически, при определённом в настройках FPU "одинарной"
точности (поубивал бы переводчиков, нет такого слова, есть
"одиночной" и "оРдинарной" = "обычной"), мог бы выдавать
компилятору этот "ключик"... - Idler(Сегодня, 20:10)
- Вы чем смотрите? Я же сказал, все 4 варианта, то есть и с 'f', и
без, и с (float) и без. Вариант 2 (с 'f' и float, но с делением
вместо умножения) - мой изначальный, выполняется столько же,
сколько "идеальный" первый. А мне предлагали варианты 2 и 3. - Idler(Сегодня, 19:40)
- Как хотите, вам виднее. - SciFi(Сегодня, 19:46)
- Достаточно добавить ключик "-fsingle-precision-constant", чтобы не
париться насчет того, что флоаты могут быть рассмотрены как double! - Eddy_Em(Сегодня, 19:54)
- У вас там ошибка: 0.001 вместо 0.001f. Дело не в Яре и не в GCC. - SciFi(Сегодня, 19:31)
- У него может быть какая-то своя реализация printf, где по дефолту
рассматривается double. И если вместо gcc используется какой-нибудь
некошерный компилятор, вполне возможно, что сначала все вычисления
в double делаются.. Eddy_Em(54 знак., Сегодня, 19:23)
- При передаче параметров в функцию float в любом случае приводится к
double, от этого не уйти. Короче, не аргумент. Внутри printf можно
параметр сразу преобразовать обратно в float, так что потери будут
только на f2d и d2f, что уже не так страшно. - SciFi(Сегодня, 19:32)
- Исходный код printf я не смотрел, так что, вполне возможно, что я
не прав. Но на кой черт вообще printf в микроконтроллеры
засовывать? - Eddy_Em(Сегодня, 19:55)
- В данном случае, только для наглядности и читабельности. При тактовой до 120МГц я бы не стал, а уж на 8-битках... С АРМом на 240 я решил, что могу себе позволить. Еще неделю назад у меня в проекте всё выводилось своими функциями, но я постепенно перестал понимать, что и куда оно выводит - пол-страницы писанины на одну строчку вывода с двумя числами. Idler(840 знак., Сегодня, 20:44)
- Исходный код printf я не смотрел, так что, вполне возможно, что я
не прав. Но на кой черт вообще printf в микроконтроллеры
засовывать? - Eddy_Em(Сегодня, 19:55)
- При передаче параметров в функцию float в любом случае приводится к
double, от этого не уйти. Короче, не аргумент. Внутри printf можно
параметр сразу преобразовать обратно в float, так что потери будут
только на f2d и d2f, что уже не так страшно. - SciFi(Сегодня, 19:32)
- Это фича свежего GCC. Вот IAR во всех вариантах: видно что первые 2
- целиком в FPU, вторые - процессорные, во много раз дольше. Idler(2117 знак., Сегодня, 19:30)
- Не будет. Вот: SciFi(1 знак., Сегодня, 19:05, картинка)
- Я что, непонятно на прошлой строчке сказал? V_DRN без (float) будет
преобразован в (double), процессором, за тысячи тактов. И
умножаться будет процессором, еще дольше. FPU делает это меньше чем
за десяток тактов. - Idler(Сегодня, 19:04)
- Пожалуйста: printf("%.3f", 0.001f * V_DRN) - SciFi(Сегодня, 18:58)
- "Партия и правительство" нас учит так не делать. В этом варианте
оба числа автоматически преобразуются в double, и процессор будет
пол-часа их перемножать. А в моём случае они грузятся в FPU, где
преобразуются и перемножаются за пару тактов. А для FPU умножать
или делить - пофиг. Можно ("%.3f", (double)((float)V_DRN *
0.001f)). - Idler(Сегодня, 18:55)
- Это точно printf из glibc? Или какая-то 100500-я реализация
непонятно кого и непонятно как? Eddy_Em(85 знак., Сегодня, 18:30)
- Я про glibc первый раз за 40 лет слышу. Гугл и ИИ про мои вопросы
конкретно отвечают, что в стандартном си это невозможно. До сих пор
тоже пользовался отдельными своими функциями вывода, но в текущем
проекте такое жуткое количество вывода, что просто захотелось
подсократить текст, улучшив читабельность. Примерно пол-страницы
превращается в одну строчку... - Idler(Сегодня, 18:36)
- Пиздец… Сорян за мой "французский"! Но как можно вообще под маздаем
разрабатывать? Это ж дичь! - Eddy_Em(Сегодня, 18:36)
- Почти весь используемый мной софт существует только под винду. Со
средами программирования еще можно что-то решить. Менять CADы в
моём возрасте уже малореально. А софт типа конфигураторов микросхем
от производителей вообще существует только под винду. - Idler(Сегодня, 18:47)
- Что такое "конфигуратор микросхем"? Впервые слышу… - Eddy_Em(Сегодня, 19:10)
- Там не совсем программатор, хотя есть и такие. Там программы для
работы с чипами видеокамер, которые через I2C наглядно с
комментариями настраивают сотни регистров (причем, "на ходу") и
сохраняют результат в EEPROM и в файл для копирования на другие
экземпляры. - Idler(Сегодня, 19:35)
- Я обычно для подобных вещей пишу небольшой "скрипт" на сях. Терпеть
не могу проприетарщину. Да и к чужому коду (особенно под
микроконтроллеры, где быдлокода на гитхабе на много порядков
больше, чем вменяемого) отношусь с подозрением… - Eddy_Em(Сегодня, 19:57)
- Там куча недокументированыых регистров. Да и в документированных "зарезервированные" биты реально меняются при некоторых настройках. Делать свой аналог - не меньше года работы, а за это время уже новая микросхема будет, со своим софтом. Такая же проблема у тех, кто с "бортовыми" компами дело имеет - все настройки только спецсофтом... - Idler(Сегодня, 20:19)
- Я обычно для подобных вещей пишу небольшой "скрипт" на сях. Терпеть
не могу проприетарщину. Да и к чужому коду (особенно под
микроконтроллеры, где быдлокода на гитхабе на много порядков
больше, чем вменяемого) отношусь с подозрением… - Eddy_Em(Сегодня, 19:57)
- Читай "Программатор микросхем, не поддерживаемых OpenOCD". Так
понятнее? - Nikolay_Po(Сегодня, 19:16)
- Вообще непонятно, я openocd использую очень редко. У меня последнее время исключительно STM32, там этот openocd нафиг не вперся. Eddy_Em(165 знак., Сегодня, 19:20)
- Там не совсем программатор, хотя есть и такие. Там программы для
работы с чипами видеокамер, которые через I2C наглядно с
комментариями настраивают сотни регистров (причем, "на ходу") и
сохраняют результат в EEPROM и в файл для копирования на другие
экземпляры. - Idler(Сегодня, 19:35)
- Что такое "конфигуратор микросхем"? Впервые слышу… - Eddy_Em(Сегодня, 19:10)
- Почти весь используемый мной софт существует только под винду. Со
средами программирования еще можно что-то решить. Менять CADы в
моём возрасте уже малореально. А софт типа конфигураторов микросхем
от производителей вообще существует только под винду. - Idler(Сегодня, 18:47)
- Пиздец… Сорян за мой "французский"! Но как можно вообще под маздаем
разрабатывать? Это ж дичь! - Eddy_Em(Сегодня, 18:36)
- Я про glibc первый раз за 40 лет слышу. Гугл и ИИ про мои вопросы
конкретно отвечают, что в стандартном си это невозможно. До сих пор
тоже пользовался отдельными своими функциями вывода, но в текущем
проекте такое жуткое количество вывода, что просто захотелось
подсократить текст, улучшив читабельность. Примерно пол-страницы
превращается в одну строчку... - Idler(Сегодня, 18:36)
- что то мне кажется что вы читаете не "тот стандарт"... - Zoro(Сегодня, 18:25)