|
Деление целых чисел, Увеличивать разрядность или приводить к float? |
|
|
|
Dec 28 2008, 11:40
|

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

|
Известно, что работа (выполнение арифметических операций) с целыми числами проще чем с дробными. Многие MC имеют в своем составе аппаратные умножители целых цисел. ("старшие" MC - DSP, ARM9 и др., имеющие мат.сопроцессоры, не рассматриваем).
Изначально, все внутренние входные, "аппаратные" данные в MC (АЦП, таймер/счетчик) являются целыми. Но как только необходимо произвести операцию деления, то рассматриваемые числа "перестают" быть целыми, появляется целая и дробная, иногда равная 0, части.
Для того чтобы не "потерять" остаток есть, на мой взгляд, два пути: 1. Увеличить разрядность чисел до необходимой точности (перед делением ужножить делимое и делитель, например, на 1000, тогда частное будет... (не продолжаю - очевидно) ); 2. Работать не с целыми (int, long), а с дробными (float) числами.
Второй вариант мне кажеться предпочтительнее - не нужно ни "запоминать" (в уме и программе) точность, ни производить дополнительных преобразований перед вычислениями. Однако, какова степень оверхеда кода и времени вычислений, затрачиваемого на алгеброические операции с числами с плавающей точкой, в сравнении с п.1? ... P.S. Естественно, что вопрос не про собственно операцию деления, а про то, что перейдя к float, "придется" работать с float во всех остальных арифмет.действиях, использовать float в качестве аргументов и возвращаемых значений функций и т.д.
|
|
|
|
|
 |
Ответов
|
Dec 28 2008, 13:50
|

Частый гость
 
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Dec 28 2008, 14:31
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Stas633 @ Dec 28 2008, 15:50)  умножение и деление на 2 это, как известно, сдвиг, который длится 1 такт (с учетом разрядности МС конечно), но, тем не менее, это лишние, избыточные действия о которых НЕОБХОДИМО помнить при написании программы. Можно возложить это на компилятор - прямая дорога в плюсы, заводите класс "число с фиксированной точкой", пишите для него преобразования и арифметику, дальше работаете как с обычными переменными. Цитата(Stas633 @ Dec 28 2008, 15:50)  А как быть если в различные моменты работы программы нужна разная точность? Ну, тут float не сильно поможет. Его точность определяется разрядностью мантиссы и для 4-байтового float (23 бита мантисса, реально 24 бита за счет нормализации) составляет log10(2^24) ~ чуть больше 7 десятичных знаков. Диапазон чисел с плавающей точкой, да, большой, и определяется разрядностью экспоненты. Поэтому если вы попытаетесь сложить 1 и 1e-8, вы получите ту же 1, чудес нет. Используя те же 32 бита в формате фиксированной точки можно получить log10(2^32) 9.6 десятичных знаков, но в существено меньшем диапазоне. Скорость вычислений с плавающей точкой будет ниже (не рассматриваем специально заточенный (со)процессор), потому что перед каждым действием операнды приводятся к одной экспоненте, а после действия результат нормализуется (мантисса приводится к двоичному виду 1.ххххх). Цитата(Stas633 @ Dec 28 2008, 15:50)  Конечно, "тригономертию" без float никак, Почему? Тригонометрия реализуется и в фиксированной точке. Цитата(Stas633 @ Dec 28 2008, 15:50)  но где та грань (водораздел, ватерлиния) когда "уже нужно"? Хороший вопрос, тянет на диссертацию  Наверное так: Если значения имеют большой диапазон, если точность и скорость float устраивает, то приносим размер кода и скорость в жертву универсальности и простоте написания - использует float. Если точность или скорость не устраивают - используем фиксированную точку. Насчет размера нужно пробовать - не факт, что сколь-нибудь полная реализация арифметики с фиксированной точкой получится компактнее. P.S. бывают случаи, когда не подходит ни тот, ни другой формат. И тогда арифметика реализуется прямо в десятичном виде, с BCD представлением чисел и изменяемой длиной числа.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
Stas633 Деление целых чисел Dec 28 2008, 11:40 sergeeff Все зависит от того, что вы собираетесь с вычислен... Dec 28 2008, 12:34 Stas633 Цитата(sergeeff @ Dec 28 2008, 16:34) Все... Dec 28 2008, 13:07  _Pasha Цитата(Stas633 @ Dec 28 2008, 17:07) Хоче... Dec 28 2008, 13:21  _Pasha Цитата(Stas633 @ Dec 28 2008, 17:50) Опят... Dec 28 2008, 14:24   Stas633 Цитата(Сергей Борщ @ Dec 28 2008, 18:31) ... Dec 28 2008, 18:47 Lelikk С float-ами следует быть вообще очень аккуратным, ... Jan 4 2009, 14:13
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|