2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Ваш вариант функции ftoa()
Сообщение12.12.2005, 19:28 
Аватара пользователя
Как-то раз пришлось мне эту функцию ручками реализовывать.... Надо было писать прогу для контроллера, которая помимо прочего должна выводить число с плав. точкой на жидкокристаллический индикатор. К контроллеру прилагался компилятор C и довольно бедная библиотека, в каковой указанная функция отсутствовала.

Функция int ftoa(double x, char *str, int buflen) должна преобразовывать число x в строку и помещать результат в буфер str, причем если все знаки числа, стоящие перед десятичной точкой в обычном формате (т.е (-)ddddd.dddd) не помещаются в буфер , его надо представить в виде (-)d.dddE(+/-)dd и в таком виде поместить в буфер. Ежели и в таком виде не поместится - надо вернуть код ошибки (к примеру, если усе получилось - возвращаем 0, иначе - код ошибки). Еще одно условие - при преобразовании желательно не использовать операции с плавающей точкой - умножение, деление и т.п.

Удалось мне все это впихнуть примерно в 250 строк кода...

Не помню, вроде был у меня тогда вариант этой функции для писюхи... Но что-то меня там не устроило (вроде там на асме было довольно много написано).

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

 
 
 
 
Сообщение13.12.2005, 23:21 
Аватара пользователя
:evil:
Интересно... Вы формат вывода с экспонентой не рассматривали? И еще вопрос - я так понимаю, что размер буфера можно ограничить (ну хотя бы количеством цифр на дисплее). Это не так? Нужно действительно произвольый вариант. А последнее - а целочисленная библиотека доступна?

 
 
 
 
Сообщение14.12.2005, 08:32 
Аватара пользователя
незванный гость писал(а):
:evil:
Интересно... Вы формат вывода с экспонентой не рассматривали? И еще вопрос - я так понимаю, что размер буфера можно ограничить (ну хотя бы количеством цифр на дисплее). Это не так? Нужно действительно произвольый вариант. А последнее - а целочисленная библиотека доступна?


Скажем так - индикаторы бывают разные (от 8 знаков в строке до 40). Числа тоже надо выводить разные... Иногда - большие, с большим кол-вом знаков до десятичной точки - тогда приходится использовать экспоненциальный формат, иногда маленькие (скажем, когда отображается значение температуры - датчик выдает всего лишь в диапазоне от 0 до 200 градусов) - тогда используется обычный формат с десятичной точкой.

Да, размер буфера как раз ограничивается числом цифр, которое отводится на ЖКИ для вывода числа.

Насчет целочисленной библиотеки...
Функция преобразования целого в строку имеется (правда, писать ее тоже пришлось самостоятельно, но сейчас речь не о ней - можно считать, что она уже есть). В принципе, как в любом компиляторе C, там тоже доступно умножение, деление, сложение, вычитание как для целых чисел, так и для чисел с плав. точкой. Просто если для чисел с плав. точкой использовать эти операции, размеры программы сразу резко увеличиваются (подключается библиотека эмуляции операций с плав. точкой), поэтому я старался не выполнять никаких арифметических операций над числами с плав. точкой. Но дело даже не столько в этом... Раз уж прога выводит числа с плав. точкой на экран, значить где-то в ней хотя бы арифметические орерации над этими числами есть. Просто каждая такая операция отнимает кучу времени, поэтому стараешься их избегать...

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group