Операции с плавающей запятой

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
ctpexhih
Встал на лапы
Сообщения: 119
Зарегистрирован: Пн окт 05, 2009 20:01:20

Операции с плавающей запятой

Сообщение ctpexhih »

Всем привет. Вопрос следующий. что означает фраза "поддержка операций с плавающей запятой"?

Объясню поподробнее. Если в Си при программировании, например, MSP430 написать:

Код: Выделить всё

float A, B, Result;

A=1.2244;
B=-9.6695;
Result=(A+B)/(A*B);
то все будет ОК. То есть компилятор поймет это все и программу можно зашить в контроллер.

Меня интересует:
1) можно ли такое писать для PIC или 8051?
2) Как вообще понять, поддерживает контроллер такие операции или нет и в чем аппаратное отличие контроллеров с поддержкой таких операций и без?
3) Если контроллер не поддерживает такие операции, а они необходимы, то как обойти это ограничение?

С уважением, Алексей.
Реклама
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Операции с плавающей запятой

Сообщение Meteor »

ctpexhih писал(а):что означает фраза "поддержка операций с плавающей запятой"?
То что система команд позволяет проводить операции с данными представленными в этом формате (например, умножение чисел)
ctpexhih писал(а):Меня интересует:
1) можно ли такое писать для PIC или 8051?
2) Как вообще понять, поддерживает контроллер такие операции или нет и в чем аппаратное отличие контроллеров с поддержкой таких операций и без?
3) Если контроллер не поддерживает такие операции, а они необходимы, то как обойти это ограничение?
Найдите в интернете книжки А. Фрунзе "Микроконтроллеры это же просто". Там (том 4 посвящен этой теме) есть ответы на Ваши вопросы применительно к 8051. Про пики не знаю, не знаком с набором команд (скорее всего можно даже при отсутствии таковых)
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Реклама
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Re: Операции с плавающей запятой

Сообщение SII »

ctpexhih писал(а):Вопрос следующий. что означает фраза "поддержка операций с плавающей запятой"?
Как уже ответили, под этим обычно имеется в виду, что процессор имеет готовые команды для работы с такими числами. У слабых микроконтроллеров (8051, АВРки и т.д.) подобных команд нет в принципе, там даже целочисленное умножение-деление не всегда имеется.
Объясню поподробнее. Если в Си при программировании, например, MSP430 написать:

Код: Выделить всё

float A, B, Result;

A=1.2244;
B=-9.6695;
Result=(A+B)/(A*B);
то все будет ОК. То есть компилятор поймет это все и программу можно зашить в контроллер.

Меня интересует:
1) можно ли такое писать для PIC или 8051?
2) Как вообще понять, поддерживает контроллер такие операции или нет и в чем аппаратное отличие контроллеров с поддержкой таких операций и без?
3) Если контроллер не поддерживает такие операции, а они необходимы, то как обойти это ограничение?
Поддержка операций с плавающей запятой в языках высокого уровня, вообще говоря, не привязана к наличию таковой у процессора. Например, на всех ПК до появления 80486 (а также на 80486SX) плавающая запятая поддерживалась специальной микросхемой -- арифметическим сопроцессором. Очень часто её не было для сокращения стоимости компутера -- и, тем не менее, плавающая запятая благополучно считалась. Дело в том, что все эти операции можно выполнить чисто программно, используя только команды целочисленной арифметики (другое дело, что это намного медленее). Соответствующие подпрограммы должны входить в библиотеку времени выполнения, используемую компилятором. Обычно они имеются, и поэтому, за исключением скорости, программисту, использующему язык высокого уровня (тот же Си), глубоко плевать, выполняются такие операции на уровне "железа" или же с помощью подпрограмм.
ctpexhih
Встал на лапы
Сообщения: 119
Зарегистрирован: Пн окт 05, 2009 20:01:20

Re: Операции с плавающей запятой

Сообщение ctpexhih »

Спасибо всем за ответы.
SII писал(а):Соответствующие подпрограммы должны входить в библиотеку времени выполнения, используемую компилятором. Обычно они имеются, и поэтому, за исключением скорости, программисту, использующему язык высокого уровня (тот же Си), глубоко плевать, выполняются такие операции на уровне "железа" или же с помощью подпрограмм.
Значит ли это, что я могу писать

Код: Выделить всё

float A, B, Result;

A=1.2244;
B=-9.6695;
Result=(A+B)/(A*B); 
потом зашивать это в ПИК и быть уверенным, что контроллер произведет нужные мне действия?

Насколько я Вас понял, компилятор сам позаботится о том, как представить в памяти МК эти числа и как с помощью набора команд ПИКа произвести с ними требуемые операции?
Реклама
Эиком - электронные компоненты и радиодетали
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

По идее, компилятор должен либо гарантировать выполнение написанного кода, либо внятно сказать: скомпилировать не могу, потому что работать с вещественными числами не обучен. Так что, если трансляция идёт нормально, то всё должно работать. Но гарантию я, естественно, дать не могу: не я ж этот компилятор писал, пользоваться им тоже не пользовался. Проверьте :)
Реклама
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Сообщение BCluster »

Да конечно можно. На Си разницы нет есть у проца флотинг поинт аппаратный или нет. Вопрос только в скорости вычислений.
Реклама
Аватара пользователя
maglev
Потрогал лапой паяльник
Сообщения: 316
Зарегистрирован: Пт апр 17, 2009 22:45:42
Откуда: Minsk
Контактная информация:

Re: Операции с плавающей запятой

Сообщение maglev »

ctpexhih писал(а): Значит ли это, что я могу писать
...
потом зашивать это в ПИК и быть уверенным, что контроллер произведет нужные мне действия?

Насколько я Вас понял, компилятор сам позаботится о том, как представить в памяти МК эти числа и как с помощью набора команд ПИКа произвести с ними требуемые операции?
Однозначно да. Это забота компилятора, а неспособный к работе с float компилятор найти непросто, и права на жизнь он не имеет.
makser
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 24, 2009 11:25:34
Откуда: Rus

Сообщение makser »

Вот только найти компилятор С с поддержкой double (с плавающей запятой двойной точности-8 байт) трудно.
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

Более того, нельзя быть абсолютно уверенным, что тип float эквивалентен аналогичному на ПК, ну и т.д. По-хорошему, стоило бы внимательно изучить документацию на компилятор, а может, и исходники библиотечных функций, обеспечивающих работу с вещественными числами -- иначе могут быть проблемы, если какой-то расчётный алгоритм "в лоб" переносить с ПК. Конечно, вычисления с "нормальными" числами сами по себе будут вестись одинаково, но может отличаться точность, а также реакция на "нештатные" ситуации типа потери значимости.
ctpexhih
Встал на лапы
Сообщения: 119
Зарегистрирован: Пн окт 05, 2009 20:01:20

Сообщение ctpexhih »

Огромное спасибо за ответы.
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

Re: Операции с плавающей запятой

Сообщение Rimsky »

Здравствуйте уважаемые форумчане. Кто нибудь может растолковать как работать с библиотекой float от микрочипа AN256 http://www.microchip.com/stellent/idcpl ... e=en011000. Помогите расписать эти примеры в десятичном формате:

7FFF EXP(6) + 01FF EXP(4) = 403F, EXPb = 07
7FFF EXP(6) - 01FF EXP(4) = 7F7F, EXPb = 06
7FFF EXP(6) * 01FF EXP(4) = FF7E, EXPb = 126
7FFF EXP(6) / 01FF EXP(4) = 4000, EXPb = FA (same as -6)

вот отрывок тестового кода из апноута:

Код: Выделить всё

;******************************************************************* 
 ;                       Test Program 
 ;******************************************************************* 
 ;    Load constant values to (ACCa, EXPa) & (ACCb, EXPb) for testing 
 ; 
 loadAB  movlw   1 
 	movwf   ACCaHI 
 	movlw   0FF             ; loads ACCa = 01FF EXP(4) 
 	movwf   ACCaLO 
 	movlw   04 
 	movwf   EXPa 
 ; 
 	movlw   07F 
 	movwf   ACCbHI 
 	movlw   0FF             ; loads ACCb = 7FFF EXP(6) 
 	movwf   ACCbLO 
 	movlw   06 
 	movwf   EXPb 
 	retlw   0 
 ; 
 main    nop 
 ; 
 	call    loadAB          ; result of adding ACCb(EXPb)+ACCa(EXPa)->ACCb(EXPb) 
 	call    F_add           ; Here Accb = 403F, EXPb = 07 
 ; 
 	call    loadAB          ; result of subtracting ACCb(EXPb)-ACCa(EXPa)->ACCb(EXPb) 
 	call    F_sub           ; Here Accb = 7F7F, EXPb = 06 
 ; 
 	call    loadAB          ; result of multiplying ACCb(EXPb) * ACCa(EXPa)->ACCb(EXPb) 
 	call    F_mpy           ; Here ACCb = FF7E, EXPb = 12 
 ; 
 	call    loadAB          ; result of dividing ACCb(EXPb) / ACCa(EXPa)->ACCb(EXPb) with 
 	call    F_div           ; remainder in ACCc. Here ACCb =4000, EXPb = FA (same as -6) 
 ;                               ; & the remainder ACCc = 003F 
 ; 
 self    goto    self 
Спасибо.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Операции с плавающей запятой

Сообщение Мастер Ломастер »

а вам необходимо именно на ассемблере работать с плавающей точкой?! мсье знает толк в извращениях! :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Операции с плавающей запятой

Сообщение pyzhman »

Не вижу в AN256 такого тестового кода.
Docendo discimus
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

Re: Операции с плавающей запятой

Сообщение Rimsky »

pyzhman писал(а):Не вижу в AN256 такого тестового кода.
Нужно качнуть архив (AN526 Source Code) с исходниками к этому апноуту, в архиве файлик: FLOAT.ASM
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: Операции с плавающей запятой

Сообщение МитяРа »

SII писал(а):там даже целочисленное умножение-деление не всегда имеется.
Это у АВР-ок, а у МК51 умножение и деление байт-байт было всегда.. а у некоторых и двух-байтное имеется.. :tea:
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Операции с плавающей запятой

Сообщение pyzhman »

2Rimsky: Шестнадцатиричное число перед EXP - мантисса. Преобразуете его в десятичный формат. И умножаете на двойку в степени, которая указана в скобках после EXP. Все, получаете десятичный формат.
Docendo discimus
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

Re: Операции с плавающей запятой

Сообщение Rimsky »

pyzhman писал(а):2Rimsky: Шестнадцатиричное число перед EXP - мантисса. Преобразуете его в десятичный формат. И умножаете на двойку в степени, которая указана в скобках после EXP. Все, получаете десятичный формат.
Спасибо, разобрался :beer:
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Операции с плавающей запятой

Сообщение pyzhman »

как работать с библиотекой float
Не актуально? Или защита прошла уже? :)
Docendo discimus
Аватара пользователя
Rimsky
Грызет канифоль
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск
Контактная информация:

Re: Операции с плавающей запятой

Сообщение Rimsky »

pyzhman писал(а):
как работать с библиотекой float
Не актуально? Или защита прошла уже? :)
Не, я отучился уже лет семь как назад. Это я для себя, для общего развития так сказать :)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»