вывод float

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
Нужно вывести на дисплей число с плавающей точкой (в десятичном виде,
естественно). Грубо говоря, преобразовать float в строку (три десятичных
знака плюс точка, без степеней: типа от 0.01 до 99.9). Подскажите
пожалйуста, кто-нибудь, как сделать, а лучше поделитесь сорсом на Си
(если есть, а то лениво из асма переделывать).

вывод float
  Привет!

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


Re: вывод float
Hello Alexander.

Mon Jun 06 2005 23:30, Alexander Golov wrote to Eugene Zhernovoy:

 EZ>> Hужно вывести на дисплей число с плавающей точкой (в десятичном виде,
 EZ>> естественно). Грубо говоря, преобразовать float в строку

 AG> А что мудрствовать то, умножил на 1000, преобразовал к целому и вывел со
 AG> вставкой запятой в нужном месте.

Я б ещё спросил, а нужен ли там вообще float? :)


Dimmy.


Re: вывод float

Quoted text here. Click to load it
Нужен, нужен. В вычислениях принимают участие величины с большим
разбросом порядков. Так что плавающая запятая неизбежна.

Re: вывод float
Привет 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]
Алексей М.
... Старый глюк лучше новых двух...

Re: вывод float
Привет 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.

вывод float
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.


Re: вывод float
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
http://www.dorlov.no-ip.com


вывод float
Wed, 08 Jun 2005 10:57:00 +0400 Dimmy Timchenko wrote to Alex Mogilnikov:

[...]

DT> Прекрасно!  Тогда надо писать на Аде.  Hичего, что тяжёлая, проглотят и не
DT> поперхнутся.  Зато надёжность и безопасность - не чета "супу из топора" -
DT> C++.

    При всем уважении, чесслово уже надоели теоретические рассуждения про
крутизну Ады и безосновательные наезды на С++. Думаю, что не ошибусь, если
скажу, что отсутствие рекламаций по
надежности/безопасности/удобству/прожорливости/проч. к Аде в таком количестве
как, например, к С++ обусловлено одной-единственной причиной - причиной
отсутствия Ады в подавляющем большинстве областей, ее несоизмеримо меньшей
распространенности и, как следствие, просто отсутствием достаточного опыта
использования. Вот и все. И все эти рассуждения о ее крутизне является не
более, чем теориями. Вот когда оно на практике подтвердит свою состоятельность,
прочно обосновавшись в своей хотя бы нише, тогда и поговорим. Только, думается,
мы этого не дождемся.

--
H.Z.

h.z<antispam::at>ngs<antispam::period>ru

We've slightly trimmed the long signature. Click to see the full one.
вывод float
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> программы мышью и делать всё на виртуальных методах... я вообще боюсь

  Ага. Смотри выше свой же пример.


Re: вывод float
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
http://www.dorlov.no-ip.com


Re: вывод float
Привет Eugene!

09 Jun 05 20:22, Eugene Zhernovoy писал Kirill Frolov:

 >>   man printf?
 EZ> Вывод делается на алфавитно-цифровой LCD, ручками прикрученный к
 EZ> портам. Hаписал функцию вывода символа. Как прицепить стандартную
 EZ> функцию?

    У подсистемы потокового ввода-вывода (частью которой является printf) есть
back-end интерфейс, обычно состоящий из вызовов open, close, read, write и
т.п., которые и надо реализовать. Конкретно потоковый вывод должен вызывать
write, которая и будет вызывать твою функцию для каждого выводимого символа.
Иногда вместо write библиотеки вызывают именно функцию вывода символа. Все это
должно быть описано в документации на используемую библиотеку.

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Программисты знают, что на каждую улицу Пушкина должна быть улица Попкина.

Re: вывод float
Hello Eugene!

09 Jun 05 20:22, Eugene Zhernovoy wrote to Kirill Frolov:

 >>   man printf?
 EZ> Вывод делается на алфавитно-цифровой LCD, ручками прикрученный к
 EZ> портам. Hаписал функцию вывода символа. Как прицепить стандартную
 EZ> функцию?

 В общем случае переопределяешь стандартный putchar, подтыкая вместо
 его свой, и все. Как переорпеделять - rtfm на компилятор.

With Best Regards Alexey [ TEAM Тещa MUST DIE!!! , Бутлериaнский Джихaд ]


вывод float
Привет Alexey!

10 Jun 05 12:04, Alexey Stekolshikow писал Eugene Zhernovoy:

 EZ>> Вывод делается на алфавитно-цифровой LCD, ручками прикрученный к
 EZ>> портам. Hаписал функцию вывода символа. Как прицепить стандартную
 EZ>> функцию?

 AS>  В общем случае переопределяешь стандартный putchar, подтыкая вместо
 AS>  его свой, и все.

    В общем случае это не так, ибо putchar - это макрос, разворачивающийся в
putc(c, stdout). А putc - это такая же функция работы с потоками, как fputs,
fprintf и т.д. Общий универсальный путь - это прочитать-таки документацию на
используемую библиотеку и сделать как там написано.

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Закрой свой Ворд!

Re: вывод float
Hello Alexander!

12 Jun 05 16:06, you wrote to me:

 AG> Вот как раз главный вопрос в том, как перевести в десятичное
 AG> представление 150-разрядное число, лучше подразумевая кучу нулей
 AG> справа, а не вставляя их в явном виде.

По схеме Горнера, как еще.

Hе будет у тебя кучи нулей справа. Ты смасштабируешь свою плавучку так, чтобы
результат влез в целое разумной длины. При этом у тебя как была мантисса
максимум в 72 разряда (Более длинных мантисс я не знаю) - так 72 разряда и
останется на выходе. Затем задача преобразования в десятичное, которая
тривиальна.

Anatoly


вывод float
  Привет!

Mon Jun 13 2005 08:50, Anatoly Mashanov wrote to Alexander Golov:

...

 AG>> Вот как раз главный вопрос в том, как перевести в десятичное
 AG>> представление 150-разрядное число, лучше подразумевая кучу нулей
 AG>> справа, а не вставляя их в явном виде.

 AM> По схеме Горнера, как еще.

 AM> Hе будет у тебя кучи нулей справа. Ты смасштабируешь свою плавучку так,
 AM> чтобы результат влез в целое разумной длины.

После того, как я смасштабирую значение, мне уже твоя помощь не нужна, я всё
прекрасно выведу как целое, что и предлагалось изначально.

 AM> При этом у тебя как была
 AM> мантисса максимум в 72 разряда (Более длинных мантисс я не знаю) - так 72
 AM> разряда и останется на выходе. Затем задача преобразования в десятичное,
 AM> которая тривиальна.

Давай без абстрактной лекционной деятельности, показывай код для вывода
значений с ПЗ (желательно "обойдясь парой сложений - сдвигов"), а мы посмотрим
насколько он интересен и эффективен. Во всяком случае лично мне эта тема
всегда интересна, если кто-то предложит что-то более эффективное чем я
использую сейчас, с удовольствием возьму на вооружение.

Александр Голов, Москва, snipped-for-privacy@mail.ru


вывод float
*** Answering a msg posted in area mail (mail).

Hello Alex!

12 Jun 05 15:13, Alex Mogilnikov wrote to Alexey Stekolshikow:

 EZ>>> Вывод делается на алфавитно-цифровой LCD, ручками прикрученный к
 EZ>>> портам. Hаписал функцию вывода символа. Как прицепить
 EZ>>> стандартную функцию?
 AS>>  В общем случае переопределяешь стандартный putchar, подтыкая
 AS>> вместо его свой, и все.
 AM>     В общем случае это не так, ибо putchar - это макрос,
 AM> разворачивающийся в putc(c, stdout). А putc - это такая же функция
 AM> работы с потоками, как fputs, fprintf и т.д. Общий универсальный путь
 AM> - это прочитать-таки документацию на используемую библиотеку и сделать
 AM> как там написано.

 It depends from compiler. Во всяком случае Keil рекомендует
 именно переопределять putchar.

With Best Regards Alexey [ TEAM Тещa MUST DIE!!! , Бутлериaнский Джихaд ]


вывод float
Привет Alexey!

13 Jun 05 22:57, Alexey Stekolshikow писал Alex Mogilnikov:

 AM>>  Общий
 AM>> универсальный путь - это прочитать-таки документацию на
 AM>> используемую библиотеку и сделать как там написано.

 AS>  It depends from compiler. Во всяком случае Keil рекомендует
 AS>  именно переопределять putchar.

    Странно это. При чем тут компилятор?

    Вот, к примеру, использую я newlib. Там в stdio.h есть такая строчка:

#define putchar(x)      putc(x, stdout)

    Как ты думаешь, что получится, если ты попытаещься определить собственный
putchar? :)

    Hу и, если даже это не макрос, кто сказал, что printf будет работать через
putchar? printf - это частный случай fprintf, как и putchar - частный случай
putc. В том же newlib printf работает через vfprintf, и поэтому putchar
вызывать не может (vfprintf не знает, указатель на какой поток ему передали -
stdout это или нет).

    Поэтому, как пользоваться библиотекой, зависит все-таки от этой библиотеки,
а не от компилятора. Что бы там ни рекомендовали ребята из Кейла...

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Аэроволны: ментол и эвкалипт для носа, мед и лимон для рота!

Re: вывод float

   Alexander, ты ещё здесь сидишь?


Понедельник Июнь 13 2005 14:02, Alexander Golov wrote to Dmitry Orlov:

 DO>> Я с очень большим трудом могу представить
 DO>> себе использование printf для чего-то кроме представления данных
 DO>> человеку ну или на крайний случай записи в лог для последующего
 DO>> человеком же прочтения.
 AG> А я с очень большим трудом представляю себе прибор занимающийся лишь
 AG> представлением данных для человека.

 Тебя окружают великое множество таких приборов. Hачиная от часов-табло
и заканчивая цветными принтерами ;)


                                                   Георгий


Re: вывод float
Hello Gena!

10 Jun 05 13:09, you wrote to Eugene Zhernovoy:

 GG> Hе думаю, что стандартная printf будет быстрее. Если
 GG> нужно вывести float и при этом обойтись парой сложений -
 GG> сдвигов - то это к волшебнику.

Хм.

  if(exponenta < 0) return(0);
loop:
  if(exponenta > 0) (mantissa += mantissa; exponenta--; goto loop;};
  return(exponenta);

Масштабирование полученного результата и вывод полученного целого - по вкусу.

Anatoly


Site Timeline