Авторизация


...

Кто на сайте?

Сейчас 115 гостей и один зарегистрированный пользователь на сайте

  • sundbarr

Статистика

-Посетители : 25302
-Материалы : 210

Пользователь сайта продает...

  Стенд для освоения программирования МК AVR

Пользователь сайта покупает...

Алгоритм работы с плавающей запятой. Часть третья

Автор: Александр Милевский Просмотров: 5279

 

 

Для записи чисел с двойной точностью требуется шестидесятичетырёхбитовое слово.

 Чаще всего числа хранятся в нескольких соседних регистрах памяти микроконтроллера. Формат числа в формате с плавающей запятой одинарной точности приведен на рисунке. На рисунке буквойSобозначен знак числа, 0 - это положительное число, 1 - отрицательное число. e обозначает смещённый порядок числа.    Коротко, о смещенном коде, К настоящему значению порядка прибавляется смещение. Смещение выбирается так, чтобы минимальному значению порядка соответствовал нуль.. Смещение требуется, чтобы не вводить в число еще один знак. Так как порядок может быть и  отрицательным, то приняли правило: порядок всегда смещенный. То есть если порядок колеблется от +12810 до -12710  то  к  порядку всегда прибавляют 12710 и тогда он колеблется в пределах  от  0 до +25510 и таким образом нам не приходится хранить знак числа. Смещённый порядок всегда положительное число.

 

alt 

 

Если знак числа отрицательный, то надо сдвигать запятую у  мантиссы вправо, если положительное влево, по разрядной сетки.

Для одинарной точности  порядка выделено восемь бит. Для смещённого порядка двойной точности отводится 11 бит. Для одинарной точности смещение принято 127, а для двойной точности  1023. В десятичной мантиссе m после запятой могут присутствовать цифры 1- 9, а в двоичной - только 1. Поэтому для хранения единицы после двоичной запятой не выделяется отдельный бит в числе с плавающей запятой. Единица подразумевается, как и двоичная запятая. Мантисса не может быть больше 1, значит, число лежит в пределах 1-2.

Рассмотрим несколько примеров:

1) Определить число с плавающей запятой, лежащее в четырёх соседних байтах:

11000001 01001000 00000000 00000000

- знаковый бит, равный 1 показывает, что число отрицательное.

- число  10000010  (смещенный код) в десятичном виде соответствует числу 130. Вычтя число 127 из 130, получим число 3. (форма 1000000или 12810 или 8016 называется EXPBIAS базой записи числа для выбранной точности)

- теперь запишем мантиссу: 1,100 1000 0000 0000 0000 0000

смещаем запятую на три разряда вправо (число отрицательное), отбрасываем незначащие нули, получаем  1100,1

- определим десятичное число: 1100,12 = 1 2,510

2) Определить число с плавающей запятой, лежащее в четырёх соседних байтах:

11000011 00110100 00000000 00000000

- Знаковый бит, равный 1 показывает, что число отрицательное.

- Число 10000110 в десятичном виде соответствует числу 134. Вычтя число 127 из 134, получим число 7.

- Теперь запишем мантиссу: 1,011 0100 0000 0000 0000 00002

- И, наконец, определим десятичное число: 101101002=18010

Для того чтобы записать ноль, достаточно записать в смещенный порядок число 000000002. Значение мантиссы при этом не имеет значения. Число, в котором все байты равны 0, тоже попадает в этот диапазон значений.

Бесконечность соответствует смещенному порядку 111111112 и мантиссе, равной 1,0. При этом существует минус бесконечность и плюс бесконечность (переполнение и антипереполнение) Все остальные комбинации битов (в том числе и все единицы) воспринимаются как не числа.

Приведу пример записи чисел 0; 1; -1 в показательной форме для более полного восприятия.

 

alt

 

Вот основные понятия в стандарте IEEE 754.

Пока не рассматривал варианты округления и возможных погрешностей. Не все сразу, с этим бы разобраться.

В принципе вплотную подошел к рассмотрению алгоритма сложения, но хотелось сделать для начала  программу преобразования 24-х битного числа двоичного числа в 32 битное в показательной форме по стандарту IEEE 754 и нормализацию 32 битного числа. Кстати перейти на работу с другими числами 8;16 разрядными, из предлагаемых  программ, очень просто.

 

3.2. Алгоритм и программа  преобразования 24 битного числа в 32 битное в показательной форме по стандарту IEEE 754 , нормализация 32 битного числа и обратное преобразование в целое число.

Сразу скажу, весь въезд был осуществляется по фирменному руководству Microchip AN575. От него и будем  отталкиваться, а там посмотрим.

Здесь только мое мнение, исключительно субъективное. Стараюсь пока делать вид, что не знаю  микрочиповских правил преобразования числа. Просто так для меня удобней.

3.2.1 Алгоритм и программа  преобразования 24 битного числа в 32 битное в показательной форме по стандарту IEEE 754.

Есть число, полученное в результате какого то действия, записанное в трех байтах. Обозначим число «А», тогда число представлено тремя регистрами А2; А1; А0. Для преобразования, это число надо дополнить порядком АХ. В байте порядка закодировано количество разрядов на которое надо сдвинуть  запятую числа А2; А1; А0 .

Число в показательной форме будет иметь вид АХ; А2; А1; А0

По правилам IEEE 754, необходимо в порядок записать базу числа EXPBIAS. Т.к. число 32 битное то EXPBIAS равен  h80 или 1000 0000b.

АХ=1000 0000 , теперь с учетом того что запятую надо перенести влево (для формирования мантиссы) прибавим к АХ число разрядов числа 24d 

AX=1000 0000 + 00011000= 10011000b    152d

Проверим:

А2А1А0= 294754d= 000001000111111101100010b

Тогда AXA2A1A0=10011000. 000001000111111101100010b

Преобразуем к десятичному  виду

Знак равен 1, значит число отрицательное, запятую сдвигать вправо

Порядок 10011000b(152d) - 1000000b(128d)  значит, запятую сдвигать вправо на 24 разряда.

Мантисса 0, 000001000111111101100010b или 0,294754d

Сдвигаем мантиссу на 24 разряда назад, получаем:

1000111111101100010b или 294754d .Ответ совпадает.

Программная реализация тоже простая.

;-------------------------------------------------------------------------------------------------
программа- заготовка  преобразования 24 битного числа в 32 битное в показательной форме по стандарту IEEE 754.
;-------------------------------------------------------------------------------------------------
;Назначаем регистры  ( отхожу от микрочиповских стандартов, напоминаю)
AX- регистр хранения порядка и знака числа
A2 - регистр хранения старшего байта мантиссы
A1 - регистр хранения среднего байта мантиссы
A0 - регистр хранения младшего байта мантиссы

EXPBIAS         equ     H'80'              ; База представления числа 10000000
;-------------------------------------------------------------------------------------------------
;Конвертирование 24-х битного числа А в формат с пл. точкой 32 бита в А
;-------------------------------------------------------------------------------------------------
Float           movlw   EXPBIAS
                movwf   AX                 ; записать константу H'80 в порядок
                movlw   0x18               ; количество разрядов числа А
                addwf   AX                 ; сложить с базой числа
;-------------------------------------------------------------------------------------------------
; Получилось четыре последовательно расположенных регистра
; В старшем, порядок, в остальных мантисса числа.
; Число преобразовано.

В AN575 подсмотрел  еще одну запись этой программы, только еще короче.

Используется оператор « + ».

 ;------------------------------------------------------------------------------------------------
Float              movlw   0x18+EXPBIAS   ;сложить 24d + база EXPBIAS
                   movwf   AX             ;и записать в порядок
;-------------------------------------------------------------------------------------------------

3.2.2 Алгоритм и программа  нормализации 32 битного числа в показательной форме по стандарту IEEE 754.

Напомню, что такое нормализация числа. После каких-то вычислений или преобразований, в мантиссе числа, до виртуальной запятой, может быть определенное количество нулей. По стандарту, нормализация заключает в себе сдвиг мантиссы влево, пока в старшем бите старшего байта мантиссы не появится 1. Соответственно надо корректировать порядок  нормализуемого числа. Все дальнейшие вычисления разрешены только с нормализованными числами. 

Попробую набросать алгоритм.

Нужно проверять биты мантиссы, сдвигая вправо, на равенство 0, пока не появится 1. Количество сдвигов считать счетчиком и сложить с порядком.

Для ускорения этого процесса проще сначала проверять байты на равенство нулю. Если равен, то сразу понятно, что от порядка надо отнимать числа 8, 16 или 24 бита.

;====================================================================
NORM32              ;Нормализация
;====================================================================
                clrf                        T                ;сбросим счетчик  сдвигов разрядов
                movf                    A2, W          ;переслать старший байт мантиссы в W
                btfss                    STATUS, Z  ;старший байт мантиссы равен 0?
                goto                     N32             ;нет, начинаем нормализацию
;-------------------------------------------------------------------------------------------------
; старший байт мантиссы равен 0 нужно вычесть число (8) сдвигов запятой в байт
; и переписать байты  из среднего в старший из младшего в средний (сдвинули запятую на 8 разрядов), записать 0 в младший байт
;-------------------------------------------------------------------------------------------------
                movf                   A1, W           ;да, скопировать средний байт мантиссы                                                          
                movwf                 A2                ;в старший
                movf                   A0, W           ;скопировать младший байт   
                movwf                 A1                ;мантиссы в  средний 
                clrf                      A0                ;очистить младший байт мантиссы
                bsf                      T, 3              ;записать 8 в счетчик сдвигов, 1 байт - 8 разрядов
                movf                   A2, W   
                btfss                   STATUS, Z   ;старший байт мантиссы равен нулю?
                goto                    N32              ;нет, начинаем нормализацию
;-------------------------------------------------------------------------------------------------
;старший байт мантиссы равен 0,  нужно вычесть число (8) сдвигов запятой в байт
;порядка и переписать байты  из среднего в старший (сдвинули запятую на еще 8 ;разрядов) записать 0 в средний  байт
;-------------------------------------------------------------------------------------------------
                 movf                   A1, W    
                 movwf                 A2               ;да, скопировать средний байт мантиссы             
                 movwf                 A2               ; в старший
                 clrf                      A1               ;записать в средний байт мантиссы нули
                 bcf                      T, 3             ;удалить из счетчика число 8
                 bsf                      T, 4             ;записать в счетчик (16d) 0001 0000
;-------------------------------------------------------------------------------------------------
; последняя проверка на ноль мантиссы 
;-------------------------------------------------------------------------------------------------
                  movf                  A2, W    
                  btfsc                  STATUS, Z   ; старший бит мантиссы равен 0?
                  goto                  ClrA              ; Значит мантисса =0, освобождаем байты мантиссы.

N32                ; подготовка к нормализации
                   movf                  T, W            ; скопировать  счетчик сдвига запятой в W
                   subwf                 AX, F           ; вычесть из байта порядка число из счетчика сдвигов

N32A           ; нормализуем мантиссу
                    bcf                    STATUS,C   ; сбросить бит С
                    rlf                      A0, F           ; если 0 сдвиг влево  все 3 байта мантиссы
                    rlf                      A1, F
                    rlf                      A2, F
                    decf                  AX, F             ; вычесть 1 из порядка
                    btfsc                 A2,MSB         ; проверить старший бит мантиссы
                    return                                    ; 1, нормализация окончена
                    goto                  N32A

ClrA                                                           ; очистить байты блока А
                    clrf                    AX
                    clrf                    A2
                    clrf                    A1
                    clrf                    A0
                    return                                    ; возврат по стеку

3.2.3 Алгоритм и программа  преобразования  нормализованного  32 битного числа в показательной форме в целое по стандарту IEEE 754.

Задача: вернуться в исходное состояние. Что должны сделать?

Мы должны, сдвигать запятую, вправо на количество разрядов записанных в порядке минус база числа. В результате преобразования порядок должен быть равен нулю.

;====================================================================
;           преобразование нормализованного числа в целое двоичное
;====================================================================

Int         
                    movlw            EXPBIAS         ;.128
                    subwf             AX, F              ; вычтем из порядка базу числа, с сохранением в
                                                                 ; нем результата
                    btfsc              STATUS, Z      ; разница равна нулю?
                    goto               ClrA                ; да, 24 битное равно нулю, очистим байты  ;мантиссы      
                    movf              AX, W             ; вычесть из возможного количества разрядов числа
                    sublw             0x18               ; порядок и  посчитаем насколько сдвигать запятую
                    movwf            AX                  ; результат в порядок 

SHIFT32    bcf                   STATUS, C    ; cдвиг  мантиссы вправо черес бит С
                  rrf                    A2, F             ; cдвиг  старшего байта мантиссы
                  rrf                    A1, F             ; cдвиг  среднего байта мантиссы
                  rrf                    A0, F             ; cдвиг  младшего байта мантиссы 
                  decfsz             AX, F             ; вычитаем 1 с проверкой результата из преобраз. порядка
                  goto                SHIFT32        ; выполняем еще раз сдвиг
                  return                                   ; возврат по стеку

ClrA                                                        ; очистить байты блока А
                  clrf                  AX
                  clrf                  A2
                  clrf                  A1
                  clrf                  A0
                  return                                   ; возврат по стеку

Мне кажется, не сложно, во всяком случае, пока.

Ссылка для скачивания доступна только авторизованным пользователям сайта !

 

 

 

Случайные статьи....

Prev Next

Программирование c нуля в AVRStudio 5 (ч.7)

07-04-2012 Радик

Программирование c нуля в AVRStudio 5 (ч.7)

Продолжим разбор теоретических основ, без которых невозможно полноценное создание программ.Основной синтаксис AVRASM совместим с AVRASM2 с исключениями, отмеченными ниже:- Ключевые слова.- Директивы препроцессора.- Комментарии.- Продолжения строк.- Строки и символьные константы.

Применение Base64-кодирования в МК.

17-12-2012 Николай Викторов

Применение Base64-кодирования в МК.

Кодирование Base64  в микроконтроллерах хоть и не так часто, но все-таки применяется. По этому и было принято решение написать данную статью в надежде что эта информация кому нибудь поможет в реализации задуманного.  Самому  пришлось столкнуться  с  кодировкой  Base64  когда появилась...

Модуль PSP

19-03-2011 Николай Викторов

Модуль PSP

  При разработки устройств на микроконтроллерах фирмы Microchip (далее МК) иногда возникает необходимость реализации параллельной передачи данных. В некоторых МК производитель предусмотрел такой режим работы, называется  «Ведомый параллельный порт» или режим PSP (Parallel Slave Port - PSP).      

Что такое микроконтроллер?

21-04-2012 Super User

   Надеюсь, Вы не сильно утомились, читая про двоичную арифметику, логические операции и т.д., но что поделаешь? Без этого никуда. Дальше  переходим к рассмотрению следующей главы -микроконтроллеры …. Микроконтроллер – в первую очередь, это микросхема, да  и  на вид практически  ничем не...


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru