вывод float

Hello, Eugene Zhernovoy! You wrote in conference fido7.ru.embedded to Kirill Frolov on Thu, 9 Jun 2005 16:22:31

+0000 (UTC):

EZ> Kirill Frolov wrote:

Написать свой putch.

dima

formatting link

Reply to
Dmitry Orlov
Loading thread data ...

Привет Eugene!

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

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

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

Reply to
Alex Mogilnikov

Hello Eugene!

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

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

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

Reply to
Alexey Stekolshikow

EZ>> Наверное, можно еще смешнее написАть. EZ> Не надо, уже и так смешно. Три операции умножения и две - деления. EZ> Нафиг-нафиг.

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

Reply to
Gena Gutnicky

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

Reply to
Anatoly Mashanov

Пpивет тебе, Eugene!

Дело было 09 июня 05, Eugene Zhernovoy и Gena Gutnicky обсуждали тему "вывод float".

EZ> Hе надо, уже и так смешно. Тpи опеpации умножения и две - деления. EZ> Hафиг-нафиг.

а в чем пpоблема? Умножение только одно тяжелое - с ПЗ, остальные целочисленка и вообще заменяются сдвигами/сложениями. Деления тоже целочисленные.

Удачи! Александp Лушников.

Reply to
Alexander V. Lushnikov

Привет 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] Алексей М. ... Закрой свой Ворд!

Reply to
Alex Mogilnikov

Привет!

Thu Jun 09 2005 20:19, Eugene Zhernovoy wrote to Gena Gutnicky:

...

EZ> Hе надо, уже и так смешно. Три операции умножения и две - деления. EZ> Hафиг-нафиг.

На всякий случай, чтобы не было непонимания, когда я предлагал сделать умножение и преобразование в целое, то не шутил, а имел ввиду именно эффективное решение. Типичная реализация преобразования в составе printf содержит серии умножений или делений на каждый выводимый разряд. Может быть есть более эффективные реализации, но когда мне было нужно я их в составе библиотек для широкораспространённых МК не обнаружил. Поэтому использование printf с наибольшей вероятностью будет в несколько раз менее эффективно.

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

Reply to
Alexander Golov

Привет!

Sat Jun 11 2005 08:51, Anatoly Mashanov wrote to Gena Gutnicky:

...

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

AM> Хм.

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

То, что ты написал называется: сдвиг "m" на "e" разрядов. При "e" достигающем

127 потребует сдвигового регистра (в твоём случае аккумулятора) в 150 разрядов, который в конечном итоге будет содержать совершенно однозначный первоначальный результат, просто сдвинутый.

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

Вот как раз главный вопрос в том, как перевести в десятичное представление

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

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

Reply to
Alexander Golov

Hello, Alexander Golov! You wrote in conference fido7.ru.embedded to Eugene Zhernovoy on Sun, 12 Jun 2005 11:36:59

+0000 (UTC):

EZ>> Hе надо, уже и так смешно. Три операции умножения и две - EZ>> деления. Hафиг-нафиг.

AG> На всякий случай, чтобы не было непонимания, когда я предлагал AG> сделать умножение и преобразование в целое, то не шутил, а AG> имел ввиду именно эффективное решение. Типичная реализация AG> преобразования в составе printf содержит серии умножений или AG> делений на каждый выводимый разряд. Может быть есть более AG> эффективные реализации, но когда мне было нужно я их в составе AG> библиотек для широкораспространённых МК не обнаружил. Поэтому AG> использование printf с наибольшей вероятностью будет в AG> несколько раз менее эффективно.

Эффективно по какому критерию? Я с очень большим трудом могу представить себе использование printf для чего-то кроме представления данных человеку ну или на крайний случай записи в лог для последующего человеком же прочтения. Мне не встречалось необходимости делать это быстро, значит речь идет об объеме кода. Да, printf довольно жруч, но если место есть, то по критерию удобства и стандартности printf сильно опрережает доморощенные решения. И если для целочисленного ввода-вывода я использую свои примитивнейшие функции, то для плавучки предпочитаю printf/sprintf.

dima

formatting link

Reply to
Dmitry Orlov

Hello Alexander!

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

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

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

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

Anatoly

Reply to
Anatoly Mashanov

Привет!

Mon Jun 13 2005 00:09, Dmitry Orlov wrote to Alexander Golov:

...

EZ>>> Hе надо, уже и так смешно. Три операции умножения и две - EZ>>> деления. Hафиг-нафиг.

AG>> Hа всякий случай, чтобы не было непонимания, когда я предлагал AG>> сделать умножение и преобразование в целое, то не шутил, а AG>> имел ввиду именно эффективное решение. Типичная реализация AG>> преобразования в составе printf содержит серии умножений или AG>> делений на каждый выводимый разряд. Может быть есть более AG>> эффективные реализации, но когда мне было нужно я их в составе AG>> библиотек для широкораспространённых МК не обнаружил. Поэтому AG>> использование printf с наибольшей вероятностью будет в AG>> несколько раз менее эффективно.

DO> Эффективно по какому критерию?

Пустой траты времени.

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

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

DO> Мне не встречалось необходимости делать это быстро, значит DO> речь идет об объеме кода.

В данном случае речь идёт о (см. выше): "Hе надо, уже и так смешно. Три операции умножения и две - деления. Hафиг-нафиг." Причём действительно смешно, потому что типичный printf потребует больше.

DO> Да, printf довольно жруч, но если место есть, DO> то по критерию удобства и стандартности printf сильно опрережает DO> доморощенные решения. И если для целочисленного ввода-вывода я использую DO> свои примитивнейшие функции, то для плавучки предпочитаю DO> printf/sprintf.

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

Out_Number (( large )( Val_Press * 1.0197162e-2 ), 5, 4 ) ; // Давление кг/см2

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

Reply to
Alexander Golov

Привет!

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

Reply to
Alexander Golov
*** 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д ]

Reply to
Alexey Stekolshikow

Hello, Alexander Golov! You wrote in conference fido7.ru.embedded to Dmitry Orlov on Mon, 13 Jun 2005 11:02:03

+0000 (UTC):

DO>> Эффективно по какому критерию?

AG> Пустой траты времени.

А for(;;) {...} - эффективная конструкция?

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

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

Да по-фиг чем занимается прибор, на преобразование форматов для вывода человеку времени много не нужно.

AG> противном случае выполнение полутора десятков умножений при AG> выводе каждого числа не видится оправданным.

Затрудняюсь сказать сколько там умножений, разбираться в библиотечном коде printf мне лень.

DO>> Мне не встречалось необходимости делать это быстро, значит DO>> речь идет об объеме кода.

AG> В данном случае речь идёт о (см. выше): "Hе надо, уже и так AG> смешно. Три операции умножения и две - деления. Hафиг-нафиг."

С этим согласен.

DO>> Да, printf довольно жруч, но если место есть, то по критерию DO>> удобства и стандартности printf сильно опрережает DO>> доморощенные решения. И если для целочисленного ввода-вывода DO>> я использую свои примитивнейшие функции, то для плавучки DO>> предпочитаю printf/sprintf.

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

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

AG> масштабирование совмещается с приведением единиц. Почему такой AG> вариант нагляден для целого и не нагляден для плавающего не

Потому что диапазон значений целых мал и обычно заранее известен. У меня это или байт или в крайнем случае слово. А число с плавающей точкой может перекрывать огромный диапазон.

AG> понимаю (уж во всяком случае когда в программе дай бог с AG> десяток таких операций вывода):

Да хоть один, какая разница?

AG> Out_Number (( large )( Val_Press * 1.0197162e-2 ), 5, 4 ) ; // Давление кг/см2

И что сие означает? И чем хуже printf("Давление %3.2f атм."); ?

dima

formatting link

Reply to
Dmitry Orlov

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

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

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

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

Георгий

Reply to
George Shepelev

Привет 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] Алексей М. ... Аэроволны: ментол и эвкалипт для носа, мед и лимон для рота!

Reply to
Alex Mogilnikov

Hello,Dmitry!

DO> Преобразовать плавучку в целый не всегда возможно, и нужно еще где- то передавать DO> информацию о порядке. В исходном письме был определен диапазон 0...99.9, исходя из которого и предложен был вариант. А когда переведешь в целые, то инф. о порядке уже и хранить нигде не надо ( опять же для запрашиваемого случая) ;

WBR G.G.

Reply to
Gena Gutnicky

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.