ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
518277 Топик полностью
Мущщина (27.05.2014 14:00, просмотров: 260) ответил Petrovich на Нет места для плавучки. Подскажите где можно разжиться библиотекой математики с фикс. точкой? Ну например 8.24 но лучше с возможностью самому задать формат. Интересуют элементарные операции: преобразование, +-*./
8.24 - это 8 разрядов на целую часть и 24 на дробную? Если так - то вот вся библиотека. :-) Сложение, вычитание ничем не отличаются от сложения-вычитания целых 32-х разрядных чисел. Абсолютно. Умножение. Если умножить 2 числа c фикс запятой, одно в формате n.m, другое в формате i.j, то результат будет в формате (n+i-1).(m+j). Дальше его обычно нужно привести к формату одного из сомножителей. Например к n.m Самый простой - сдвинуть вправо на j разрядов (это усечение) и от результата сдвига оставить младшие n+m разрядов. Все будет замечательно, если целая часть результата всегда убирается в n разрядов. Если не убирается - обычных программистов это не смущает :-) Для обработки сигналов обычно делают проверку на переполнение. И если оно было - заменяют результат максимальным по модулю либо положительным, либо отрицательным числом. В зависимости от знака. В приложении к тебе и к формату 8.24. Самое простое -тебе надо для сомножителей использовать int64 (сомножители в младших 32-х разрядах само собой). Умножаешь два int64 друг на дружку обычной сишной операцией. Получаешь 64-х разрядный результат. Сдвигаешь его вправо на 24 разряда. И оставляешь младшие 32 разряда от результата сдвига. Это будет усечение результата и без контроля переполнения. Контроль переполнения делается по старшим 10 разрядам 64-х разрядного результата умножения. Все 10 разрядов должны быть одинаковы и равны 0 для положительного результата или 1 для отрицательного. В противном случае - переполнение. Деление. Для деления тебе нужно опять же нужно для делимое и делителя использовать int64. Делишь одно 64 разрядное целое на другое. Частное будет целой частью результата формата 8.24. Остаток сдвигаешь на 24 разряда влево и делишь на делитель. Младшие 24 разряда частного этого второго деления будет представлять собой дробную часть нужного тебе результата. Объединяешь целую и дробную части в одном 32 разрядном слове. :-)