реклама на сайте
подробности

 
 
> Деление целых чисел, Увеличивать разрядность или приводить к float?
Stas633
сообщение Dec 28 2008, 11:40
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901



Известно, что работа (выполнение арифметических операций) с целыми числами проще чем с дробными. Многие MC имеют в своем составе аппаратные умножители целых цисел. ("старшие" MC - DSP, ARM9 и др., имеющие мат.сопроцессоры, не рассматриваем).

Изначально, все внутренние входные, "аппаратные" данные в MC (АЦП, таймер/счетчик) являются целыми. Но как только необходимо произвести операцию деления, то рассматриваемые числа "перестают" быть целыми, появляется целая и дробная, иногда равная 0, части.

Для того чтобы не "потерять" остаток есть, на мой взгляд, два пути:
1. Увеличить разрядность чисел до необходимой точности (перед делением ужножить делимое и делитель, например, на 1000, тогда частное будет... (не продолжаю - очевидно) );
2. Работать не с целыми (int, long), а с дробными (float) числами.

Второй вариант мне кажеться предпочтительнее - не нужно ни "запоминать" (в уме и программе) точность, ни производить дополнительных преобразований перед вычислениями. Однако, какова степень оверхеда кода и времени вычислений, затрачиваемого на алгеброические операции с числами с плавающей точкой, в сравнении с п.1?
...
P.S. Естественно, что вопрос не про собственно операцию деления, а про то, что перейдя к float, "придется" работать с float во всех остальных арифмет.действиях, использовать float в качестве аргументов и возвращаемых значений функций и т.д.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sergeeff
сообщение Dec 28 2008, 12:34
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Все зависит от того, что вы собираетесь с вычисленными значениями делать. Да и что за задача (чисто вычислительная или управление чем-то). Плавающая точка содержит кучу подводных камней (помимо скорости вычисления). В 70-х годах было издано довольно много книг, посвященных вопросам точности вычислений.
Go to the top of the page
 
+Quote Post
Stas633
сообщение Dec 28 2008, 13:07
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901



Цитата(sergeeff @ Dec 28 2008, 16:34) *
Все зависит от того, что вы собираетесь с вычисленными значениями делать. Да и что за задача (чисто вычислительная или управление чем-то).

Не хотелось бы "углубляться", но... например.
Один вариант - нужно расчитать значение и вывести его на индикатор. Выводить в формате плавающей точки ("1.234E-2"), согласитесь, не привычно для "глаза". Нужно точку "фиксировать" (0,01234).
Другой вариант - нужно на расчитанное значение позиционировать, например, инструмент станка (руку робота и т.д.). И опять придется переводить float значение к единицам позиционирования (к ЦЕЛОМУ их числу). (А если дискретность перемещения не имеет 10-ное основание, то преобразование еще "длиннее").
Т.е. на лицо необходимость "обратного" преобразования float -> long. /НO!, вместе с тем, функции, написанные с использованием float, проще для "понимания", переносимее, универсальнее, если хотите./
Что может быть разным в этих вариантах? (с точки зрения работы с float)

Цитата(sergeeff @ Dec 28 2008, 16:34) *
Плавающая точка содержит кучу подводных камней (помимо скорости вычисления). В 70-х годах было издано довольно много книг, посвященных вопросам точности вычислений.

Каких именно?
И еще одно уточнение... Вопрос достижения заданной точности не рассматривается. Хочется сравнить LONG v/s FLOAT /оверхед & скорость/
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 23:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.0136 секунд с 7
ELECTRONIX ©2004-2016