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

 
 
> Деление целых чисел, Увеличивать разрядность или приводить к 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
Ответов
arttab
сообщение Dec 28 2008, 12:48
Сообщение #2


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



можно делить на 2 в степени n. можно умножить на 10, 100... потом делить и получите требуемую точность.
а можно и не делить а работать с не поделенными значениями.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Stas633
сообщение Dec 28 2008, 13:50
Сообщение #3


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

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



Цитата(arttab @ Dec 28 2008, 16:48) *
можно делить на 2 в степени n.

Согласен. С точки зрения кода это, безусловно, и быстрее, и короче (чем умножение/деление на 10^n) - умножение и деление на 2 это, как известно, сдвиг, который длится 1 такт (с учетом разрядности МС конечно), но, тем не менее, это лишние, избыточные действия о которых НЕОБХОДИМО помнить при написании программы.
А как быть если в различные моменты работы программы нужна разная точность? Передавать функции точность вычислений в качестве аргумента? Или писать несколько функций?

Цитата(_Pasha @ Dec 28 2008, 17:21) *
Кесарю-кесарево. Математика (синусы, косинусы) вся на float? Гут - будем в плавучке. А управляющие алгоритмы редко выходят на плавучку - больше на long. Вот такой водораздел...

Опять в "крайности"(сложности). Конечно, "тригономертию" без float ни как, но где та грань (водораздел, ватерлиния) когда "уже нужно"? Возведение в степень, деление..?
...
Хорошо.. тогда так:
допустим, необходимо вычислять такую фунцкию
Код
y=(x^2 + k) / z

Вроде "МАТЕМАТИКИ" нет, но если не использовать float, то сразу возникает, как минимум, один вопрос: с какой точностью нужно производить вычисления?
А если достаточная точность неизвестна перед началом программирования, да и вообще, может быть различной?

......
......
Если попытаться ответить на вопрос топика, то правильно ли мнение, что:

В случае, когда необходимая точность вычислений известна и не меняется, и математические формулы ограничены четырмя основными арифметическими действиями (+, -, *, /), то целесообразно применение long переменных, с соответствующими преобразованиями. В остальных случаях лучше, правильнее применять float.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 28 2008, 14:24
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Stas633 @ Dec 28 2008, 17:50) *
Опять в "крайности"(сложности)

Пример, недавно обсуждаемый: накапливающее суммирование. Если точность вмещается в мантиссу - пожалста, плавучка применима. Если нет - происходит накопление ошибки округления. А сие очень часто возможно, если вспомнить про 24-разрядные АЦП.

Опять про водораздел: например, некая моделька на борту контроллера, считается что-то методом Ньютона-Раффсона. Плавучка? Конечно! Но вот моделька соприкасается с реальностью - 10-разрядные АЦП/ЦАП, таймера с тиком 100мкс... Что мы делаем? Только dst = SCALE * round().


Цитата
В случае, когда необходимая точность вычислений известна и не меняется

Я бы оставил так
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 07:53
Рейтинг@Mail.ru


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