вывод float - Page 2

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

Translate This Thread From Russian to

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

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


Re: вывод float
          Пpивет тебе, Eugene!

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


Quoted text here. Click to load it

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

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

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



Re: вывод float
Hемедленно нажми на RESET, Alexander V. Lushnikov!


 >>> i=int (x*1000.0+0.5) ;
 >>> j=i/100 ; i-=(j*100) ; str[0]=j|0x30 ;
 EZ>> Hе надо, уже и так смешно. Тpи опеpации умножения и две - деления.
 AVL> а в чем пpоблема? Умножение только одно тяжелое - с ПЗ, остальные
 AVL> целочисленка
 AVL> и вообще заменяются сдвигами/сложениями. Деления тоже целочисленные.

  Проблема в том, что вообще всё это заменяется сложениям с двоично-
десятичной коррекцией. Сложений по числу двоичных разрядов.


вывод float
Hello Dimmy!

Jun 08 11:57 05, Dimmy Timchenko wrote to Alex Mogilnikov:

 DT> отдельные функции типа int2str, float2str (на самом деле их может
 DT> быть много, с разными возможностями).  Тогда и реализация получается
 DT> более красивой и атомарной, и использование более простым и
 DT> интуитивным:
 DT>     puts ("On step " + int2str(step) + " value is " +
 DT> float2str(value) );
Я такое делал стандартными средствами ADA83. Компилировалось и работало в досе
и линуксе. В досе компилятор Meridian ADA, в Линуксе - gnat.

 DT> Прекрасно!  Тогда надо писать на Аде.  Hичего, что тяжёлая, проглотят
 DT> и не поперхнутся.  
Мнение о "тяжести" Ады - не более чем расхожий штамп. Код после gnat я правда
не изучал, а читая в отладчике код после Meridian ADA - восхищался изяществом и
эффективностью. В сравнении с Microsoft C 5.10 тех же времен - смотрелось куда
как лучше. Единственная особенность - Ада "по умолчанию" тащит с собой рантайм,
несколько больше чем у Си. Hо его размер (в досе) был около десятка килобайтов.
Интересно, что весь вечер сидишь, пишешь, потом смотришь на размер исполняемого
файла - а он совсем незначительно прибавился по сравнению с вообще "пустым"
исходником. То есть если разобраться с рантаймом того же Гната и научиться там
"выключать" ненужное в проекте - то можно писать и под встроенные системы. Вон,
avr-ada делают потихоньку... Правда год назад, когда я на нее смотрел, она была
еще неработоспособна при попытке запустить ее не на машине у автора:)

 DT> Зато надёжность и безопасность - не чета "супу из топора" - C++.
Это точно! Компилятор просто не дает сделать ошибку! Ругается и мешается как
только может. Правда такое его поведение не понравится сторонникам "свободного
стиля" в программировании:-)

Zahar


Re: вывод float
Hello Alexander!

Jul 01 00:12 05, Alexander Golov wrote to Dmitry Orlov:

 AG>>> Кроме того, лично меня принципиально не устраивает вывод точки
 AG>>> в качестве десятичной запятой, а создатели вроде как
 DO>> Hу это уже твои личные проблемы, меня вплоне устраивает этот
 DO>> общепринятый вариант.
 AG> Общепринято использовать десятичную запятую,
Ты сходу можешь назвать хоть один _прибор_, выводящий именно запятую в качестве
разделителя? Hе надо все-таки путать книжную полиграфию и метрологию...
 AG> а заморочки программистов действительно лишь их личные проблемы.
В ГОСТах - тоже "личные заморочки"?

Zahar


вывод float
Hi Zahar, hope you are having a nice day!


01 Июл 05, Zahar Kiselev wrote to Alexander Golov:

 ZK> Ты сходу можешь назвать хоть один _прибор_, выводящий именно запятую в
 ZK> качестве разделителя? Hе надо все-таки путать книжную полиграфию и
 ZK> метрологию...
 AG>> а заморочки программистов действительно лишь их личные проблемы.
 ZK> В ГОСТах - тоже "личные заморочки"?

Отсюда по-подробнее, пожалуйста. В каких гостах запрещают использовать запятую
в качестве отделителя дробной части?

WBR,
    AVB


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

Fri Jul 01 2005 09:41, Zahar Kiselev wrote to Alexander Golov:

...

 AG>> Общепринято использовать десятичную запятую,

 ZK> Ты сходу можешь назвать хоть один _прибор_, выводящий именно запятую в
 ZK> качестве разделителя?

Если не ворошить дальние ящики вот: Ч3-63 и Г5-78 на обоих обозначены
разделители запятые. Уверен, если вытащить ещё с десяток советских приборов,
результат будет тот же. На импортных скорее всего будут точки (под англо-
американский стиль), причём в современных в немалой степени и потому, что
printf вариантов не продоставляет.

 ZK> Hе надо все-таки путать книжную полиграфию и метрологию...

Я не знаю причём тут некая "книжная полиграфия" и уже тем более метрология, а
записывать числа учат в школе.

 AG>> а заморочки программистов действительно лишь их личные проблемы.

 ZK> В ГОСТах - тоже "личные заморочки"?

В ГОСТах то как раз всё в порядке, только запятые, хотя, конечно, в нынешних
новоделах чего только не встретишь, они подчас даже собственную терминологию
провести через весь текст оказываются не способны.

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


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


вывод float
Thu Jun 09 2005 10:55, Dimmy Timchenko wrote to Dmitry Orlov:

 DT>>> Прекрасно!  Тогда надо писать на Аде.
 DO>> Так пиши, кто тебе не дает?
 DT> Разработчики компиляторов. ;)

  В том смысле, что компиляторов горячо любимой Ады просто нет?


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


Re: вывод float
Hello Harry.

Thu Jun 09 2005 08:52, Harry Zhurov wrote to me:

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

 HZ> При всем уважении, чесслово уже надоели теоретические рассуждения
 HZ> про крутизну Ады и безосновательные наезды на С++.

Ладно-ладно.  Кажется, это тебя задевает лично. ;)  Постараюсь обходить эти
темы.


Dimmy.


вывод float
Thu, 09 Jun 2005 12:56:40 +0400 Dimmy Timchenko wrote to Harry Zhurov:

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

HZ>> При всем уважении, чесслово уже надоели теоретические рассуждения
HZ>> про крутизну Ады и безосновательные наезды на С++.

DT> Ладно-ладно.  Кажется, это тебя задевает лично. ;)  Постараюсь обходить эти
DT> темы.

    Ничего личного. Просто оценка "суп из топора" про С++ совершенно
неадекватна. Не нравится - не пиши на нем. Но не стОит лажать
широкоиспользуемый и мощный инструмент только потому, что тебе кажется, что
есть лучше.


--
H.Z.

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

We've slightly trimmed the long signature. Click to see the full one.
Re: вывод float
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.


--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Re: вывод float

Quoted text here. Click to load it
Не надо, уже и так смешно. Три операции умножения и две - деления.
Нафиг-нафиг.

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

Не думаю, что стандартная printf будет быстрее. Если
нужно вывести float и при этом обойтись парой сложений -
сдвигов - то это к волшебнику.
 
WBR G.G.
--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

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

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

...

 >> 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) ;
 >>
 >> Hаверное, можно еще смешнее написАть.

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

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

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


Re: вывод float
Hello, Alexander Golov!
You wrote in conference fido7.ru.embedded to Eugene Zhernovoy on Sun, 12 Jun
2005 11:36:59
+0000 (UTC):


 >>> 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) ;

 >>> Hаверное, можно еще смешнее написАть.

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

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


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

dima
http://www.dorlov.no-ip.com


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

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


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


Re: вывод float
Hello,Dmitry!

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

WBR G.G.
 
--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Site Timeline