Нужно вывести на дисплей число с плавающей точкой (в десятичном виде, естественно). Грубо говоря, преобразовать float в строку (три десятичных знака плюс точка, без степеней: типа от 0.01 до 99.9). Подскажите пожалйуста, кто-нибудь, как сделать, а лучше поделитесь сорсом на Си (если есть, а то лениво из асма переделывать).
вывод float
Jun 06, 2005
75 Replies
Привет!
Mon Jun 06 2005 21:46, Eugene Zhernovoy wrote to All:
EZ> Hужно вывести на дисплей число с плавающей точкой (в десятичном виде, EZ> естественно). Грубо говоря, преобразовать float в строку (три десятичных EZ> знака плюс точка, без степеней: типа от 0.01 до 99.9). Подскажите EZ> пожалйуста, кто-нибудь, как сделать, а лучше поделитесь сорсом на Си EZ> (если есть, а то лениво из асма переделывать).
А что мудрствовать то, умножил на 1000, преобразовал к целому и вывел со вставкой запятой в нужном месте.
Александр Голов, Москва, snipped-for-privacy@mail.ru
Hello Alexander.
Mon Jun 06 2005 23:30, Alexander Golov wrote to Eugene Zhernovoy:
EZ>> Hужно вывести на дисплей число с плавающей точкой (в десятичном виде, EZ>> естественно). Грубо говоря, преобразовать float в строку
AG> А что мудрствовать то, умножил на 1000, преобразовал к целому и вывел со AG> вставкой запятой в нужном месте.
Я б ещё спросил, а нужен ли там вообще float? :)
Dimmy.
Привет Eugene!
06 Jun 05 21:46, Eugene Zhernovoy писал All:EZ> Hужно вывести на дисплей число с плавающей точкой (в десятичном виде, EZ> естественно). Грубо говоря, преобразовать float в строку (три EZ> десятичных знака плюс точка, без степеней: типа от 0.01 до 99.9). EZ> Подскажите пожалйуста, кто-нибудь, как сделать, а лучше поделитесь EZ> сорсом на Си (если есть, а то лениво из асма переделывать).
sprintf(string, "%1.2f", value);
Или тут есть какой-то подвох? :)
Всего наилучшего, [Team PCAD 2000] Алексей М. ... Старый глюк лучше новых двух...
man printf?
Привет Dimmy!
07 Jun 05 14:07, Dimmy Timchenko писал Alex Mogilnikov:AM>> sprintf(string, "%1.2f", value); AM>> Или тут есть какой-то подвох? :)
DT> Hу, наверное, килобайта четыре лишнего кода. :)
Если он используется, значит нелишний. :)
DT> Вообще, пользоваться DT> такими средствами в мелких встроенных системах, по-моему, дурной тон. DT> Разве что для отладочной печати...
По-моему ничего дурного здесь нет. Во-первых (побуквоедствую маленько), Евгений не уточнял, что его система - мелкая. :) Во-вторых, во многие мелкие по современным меркам системы (у нас например много систем с 512 кбайт ОЗУ, вряд ли кто-то сегодня назовет это крупной системой) легко эти "лишние" 4К проглотят и не поперхнутся. Зато разработчик сможет взять уже готовое и отлаженное библиотечное решение вместо того чтобы заниматься изобретением и отладкой своего. Так что априори считать использование printf дурным тоном - дурной тон. :) Hа религию похоже...
Всего наилучшего, [Team PCAD 2000] Алексей М. ... В системе возможно бесконечное число процессов - до 256.
Hello Alex.
Wed Jun 08 2005 00:05, Alex Mogilnikov wrote to me:
AM>>> sprintf(string, "%1.2f", value); AM>>> Или тут есть какой-то подвох? :)
DT>> Hу, наверное, килобайта четыре лишнего кода. :)
AM> Если он используется, значит нелишний. :)
А, не люблю я эту хреновину. Типичный пример сделанного на коленке явно _отладочного_ средства: неудобно, небезопасно и "тяжело". Куда приятнее было бы иметь (и в C тоже) оператор конкатенации строк "+" и отдельные функции типа int2str, float2str (на самом деле их может быть много, с разными возможностями). Тогда и реализация получается более красивой и атомарной, и использование более простым и интуитивным:
puts ("On step " + int2str(step) + " value is " + float2str(value) );
И использоваться будут только те функции, которые нужны в данном проекте.
DT>> Вообще, пользоваться такими средствами в мелких встроенных системах, DT>> по-моему, дурной тон. Разве что для отладочной печати...
AM> По-моему ничего дурного здесь нет. Во-первых (побуквоедствую AM> маленько), Евгений не уточнял, что его система - мелкая. :)
Hу, если он такие вопросы задаёт, то на крупное вряд ли замахивается. ;)
AM> Во-вторых, во многие мелкие по современным меркам системы (у нас AM> например много систем с 512 кбайт ОЗУ, вряд ли кто-то сегодня назовет AM> это крупной системой)
Смотря в каком контексте. Для МК типичны единицы килобайт (а то и сотни байт) ОЗУ, и их обычно вполне хватает. Впрочем, если и тут начнут писать программы мышью и делать всё на виртуальных методах... я вообще боюсь представить, во что это может вылиться. Если виндовая программа виснет или трапается, это можно пережить. А если так будет себя вести система управления чем-то серьёзным?
AM> легко эти "лишние" 4К проглотят и не поперхнутся. Зато разработчик AM> сможет взять уже готовое и отлаженное библиотечное решение вместо того AM> чтобы заниматься изобретением и отладкой своего. Так что априори AM> считать использование printf дурным тоном - дурной тон. :) Hа религию AM> похоже...
Прекрасно! Тогда надо писать на Аде. Hичего, что тяжёлая, проглотят и не поперхнутся. Зато надёжность и безопасность - не чета "супу из топора" - C++.
Dimmy.
Hello, Dimmy Timchenko! You wrote in conference fido7.ru.embedded to Alex Mogilnikov on Wed, 08 Jun 2005 10:57:00
+0400:DT> А, не люблю я эту хреновину. Типичный пример сделанного на DT> коленке явно _отладочного_ средства: неудобно, небезопасно и DT> "тяжело". Куда приятнее было бы иметь (и в C тоже) оператор
Вполне удобно, и если функциональность используется, то не так и тяжело.
DT> конкатенации строк "+" и отдельные функции типа int2str, DT> float2str (на самом деле их может быть много, с разными DT> возможностями).
Вот sprintf это и делает.
DT> Тогда и реализация получается более красивой и атомарной, и использование более DT> простым и интуитивным: DT> puts ("On step " + int2str(step) + " value is " + float2str(value) );
А теперь подумай, что форматов вывода float есть целая куча, и посмотри к чему приведет твой подход. Скажем сколько знаков выведет твой float2str? в экспоненциальном или нет формате etc.
DT> Смотря в каком контексте. Для МК типичны единицы килобайт (а> то и сотни байт) DT> ОЗУ, и их обычно вполне хватает.
Для printf много ОЗУ не нужно, код в ПЗУ.
AM>> легко эти "лишние" 4К проглотят и не поперхнутся. Зато
Да уже при 32к ПЗУ 4 к - не трагедия.
AM>> разработчик сможет взять уже готовое и отлаженное AM>> библиотечное решение вместо того чтобы заниматься AM>> изобретением и отладкой своего. Так что априори считать AM>> использование printf дурным тоном - дурной тон. :) Hа религию AM>> похоже...
DT> Прекрасно! Тогда надо писать на Аде.
Так пиши, кто тебе не дает?
dima
formatting link
Wed, 08 Jun 2005 10:57:00 +0400 Dimmy Timchenko wrote to Alex Mogilnikov:
[...]DT> Прекрасно! Тогда надо писать на Аде. Hичего, что тяжёлая, проглотят и не DT> поперхнутся. Зато надёжность и безопасность - не чета "супу из топора" - DT> C++.
При всем уважении, чесслово уже надоели теоретические рассуждения про крутизну Ады и безосновательные наезды на С++. Думаю, что не ошибусь, если скажу, что отсутствие рекламаций по надежности/безопасности/удобству/прожорливости/проч. к Аде в таком количестве как, например, к С++ обусловлено одной-единственной причиной - причиной отсутствия Ады в подавляющем большинстве областей, ее несоизмеримо меньшей распространенности и, как следствие, просто отсутствием достаточного опыта использования. Вот и все. И все эти рассуждения о ее крутизне является не более, чем теориями. Вот когда оно на практике подтвердит свою состоятельность, прочно обосновавшись в своей хотя бы нише, тогда и поговорим. Только, думается, мы этого не дождемся.
Hello Dmitry.
Wed Jun 08 2005 20:47, Dmitry Orlov wrote to me:
DT>> А, не люблю я эту хреновину. Типичный пример сделанного на DT>> коленке явно _отладочного_ средства: неудобно, небезопасно и DT>> "тяжело". Куда приятнее было бы иметь (и в C тоже) оператор
DO> Вполне удобно, и если функциональность используется, то не так и тяжело.
Hу, suum quique. Сила привычки - страшная вещь.
DT>> конкатенации строк "+" и отдельные функции типа int2str, DT>> float2str (на самом деле их может быть много, с разными DT>> возможностями).
DO> Вот sprintf это и делает.
DT>> Тогда и реализация получается более красивой и атомарной, и DT>> использование более простым и интуитивным: DT>> puts ("On step " + int2str(step) + " value is " + float2str(value) DT>> );
DO> А теперь подумай, что форматов вывода float есть целая куча, и посмотри к DO> чему приведет твой подход. Скажем сколько знаков выведет твой float2str? в DO> экспоненциальном или нет формате etc.
Я же выше сказал: на самом деле их может быть много, с разными возможностями. В том числе и самому дописать - пара пустяков. Hо сам этот подход отличается принципиально: атомарностью и ортогональностью.
DT>> Прекрасно! Тогда надо писать на Аде.
DO> Так пиши, кто тебе не дает?
Разработчики компиляторов. ;)
Dimmy.
Hello Harry.
Thu Jun 09 2005 08:52, Harry Zhurov wrote to me:
DT>> Прекрасно! Тогда надо писать на Аде. Hичего, что тяжёлая, проглотят и DT>> не поперхнутся. Зато надёжность и безопасность - не чета "супу из DT>> топора" - C++.
HZ> При всем уважении, чесслово уже надоели теоретические рассуждения HZ> про крутизну Ады и безосновательные наезды на С++.
Ладно-ладно. Кажется, это тебя задевает лично. ;) Постараюсь обходить эти темы.
Dimmy.
Eugene Zhernovoy пишет: EZ> Нужно вывести на дисплей число с плавающей точкой (в десятичном виде, EZ> естественно). Грубо говоря, преобразовать float в строку (три десятичных EZ> знака плюс точка, без степеней: типа от 0.01 до
99.9). Подскажите EZ> пожалйуста, кто-нибудь, как сделать, а лучше поделитесь сорсом на Си EZ> (если есть, а то лениво из асма переделывать).int i,j ; float x ; char str[5] ; i=int (x*1000.0+0.5) ; j=i/100 ; i-=(j*100) ; str[0]=j|0x30 ; j=i/10 ; i-=(j*10) ; str[1]=j|0x30 ; str[2]='.' ; str[3]=i|0x30 ; str[4]=0 ; puts (str) ;
Наверное, можно еще смешнее написАть. WBR G.G.
Wed Jun 08 2005 11:57, Dimmy Timchenko wrote to Alex Mogilnikov:
AM>> Если он используется, значит нелишний. :) DT> А, не люблю я эту хреновину. Типичный пример сделанного на коленке явно DT> _отладочного_ средства: неудобно, небезопасно и "тяжело". Куда приятнее DT> было бы иметь (и в C тоже) оператор конкатенации строк "+" и отдельные DT> функции типа int2str,
man asprintf?
DT> float2str (на самом деле их может быть много, с
man atof strtol strtoul atoi strtod atol...?
DT> разными возможностями). Тогда и реализация получается более красивой и DT> атомарной, и использование более простым и интуитивным: DT> puts ("On step " + int2str(step) + " value is " + float2str(value) );
Интуитивного не бывает. В остальном указанное решение подразумевает или возню с динамическим выделением памяти, или тот же printf. Последнее в "маленькой системе" явно более предпочтительно.
DT> И использоваться будут только те функции, которые нужны в данном проекте.
Разве что. Только глядя на исходники printf одной известной фирмы можно сказать, что функций там, пишу по памяти, штуки 3. Возможно что, я согласен, библиотечный printf перегружен ненужными возможностями и неплохо было бы иметь легковесную функцию.
DT> Смотря в каком контексте. Для МК типичны единицы килобайт (а то и сотни DT> байт) ОЗУ, и их обычно вполне хватает. Впрочем, если и тут начнут писать DT> программы мышью и делать всё на виртуальных методах... я вообще боюсь
Ага. Смотри выше свой же пример.
Thu Jun 09 2005 10:55, Dimmy Timchenko wrote to Dmitry Orlov:
DT>>> Прекрасно! Тогда надо писать на Аде. DO>> Так пиши, кто тебе не дает? DT> Разработчики компиляторов. ;)
В том смысле, что компиляторов горячо любимой Ады просто нет?
Thu, 09 Jun 2005 12:56:40 +0400 Dimmy Timchenko wrote to Harry Zhurov:
DT>>> Прекрасно! Тогда надо писать на Аде. Hичего, что тяжёлая, проглотят и DT>>> не поперхнутся. Зато надёжность и безопасность - не чета "супу из DT>>> топора" - C++.
HZ>> При всем уважении, чесслово уже надоели теоретические рассуждения HZ>> про крутизну Ады и безосновательные наезды на С++.
DT> Ладно-ладно. Кажется, это тебя задевает лично. ;) Постараюсь обходить эти DT> темы.
Ничего личного. Просто оценка "суп из топора" про С++ совершенно неадекватна. Не нравится - не пиши на нем. Но не стОит лажать широкоиспользуемый и мощный инструмент только потому, что тебе кажется, что есть лучше.
Нужен, нужен. В вычислениях принимают участие величины с большим разбросом порядков. Так что плавающая запятая неизбежна.
Не надо, уже и так смешно. Три операции умножения и две - деления. Нафиг-нафиг.
Вывод делается на алфавитно-цифровой LCD, ручками прикрученный к портам. Написал функцию вывода символа. Как прицепить стандартную функцию?
Hello, Dimmy Timchenko! You wrote in conference fido7.ru.embedded to Dmitry Orlov on Thu, 09 Jun 2005 09:55:32
+0400:DT>>> А, не люблю я эту хреновину. Типичный пример сделанного на DT>>> коленке явно _отладочного_ средства: неудобно, небезопасно и DT>>> "тяжело". Куда приятнее было бы иметь (и в C тоже) оператор
DO>> Вполне удобно, и если функциональность используется, то не DO>> так и тяжело.
DT> Hу, suum quique. Сила привычки - страшная вещь.
Видимо тебе это средство кажется слишком непривычным.
DT>>> конкатенации строк "+" и отдельные функции типа int2str, DT>>> float2str (на самом деле их может быть много, с разными DT>>> возможностями).
DO>> Вот sprintf это и делает.
DT>>> Тогда и реализация получается более красивой и атомарной, и DT>>> использование более простым и интуитивным: DT>>> puts ("On step " + int2str(step) + " value is " + DT>>> float2str(value));
DO>> А теперь подумай, что форматов вывода float есть целая куча, DO>> и посмотри к чему приведет твой подход. Скажем сколько знаков DO>> выведет твой float2str? в экспоненциальном или нет формате etc.
DT> Я же выше сказал: на самом деле их может быть много, с разными DT> возможностями.
И по-твоему, пользоваться кучей разных функций удобней, чем одной sprintf?
DT> В том числе и самому дописать - пара пустяков. Hо сам этот
Самому и на С пара пустяков написать. Только зачем писать то, что уже написано?
DT> подход отличается принципиально: атомарностью и ортогональностью.
Самому все писать?
DT>>> Прекрасно! Тогда надо писать на Аде.
DO>> Так пиши, кто тебе не дает?
DT> Разработчики компиляторов. ;)
Так к ним и обращайся, к чему тут эти пустые разговоры?
dima
formatting link
Hello, Kirill Frolov! You wrote in conference fido7.ru.embedded to Dimmy Timchenko on Thu, 9 Jun 2005 09:45:14
+0000 (UTC):KF> Разве что. Только глядя на исходники printf одной известной KF> фирмы можно сказать, что функций там, пишу по памяти, штуки 3. KF> Возможно что, я согласен, библиотечный printf перегружен KF> ненужными возможностями и неплохо было бы иметь легковесную KF> функцию.
Что в embedded обычно и реализовано.
dima
formatting link
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required