Страница 1 из 1

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

Добавлено: Пн окт 05, 2009 20:09:09
ctpexhih
Всем привет. Вопрос следующий. что означает фраза "поддержка операций с плавающей запятой"?

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

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

float A, B, Result;

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

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

С уважением, Алексей.

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

Добавлено: Пн окт 05, 2009 20:25:24
Meteor
ctpexhih писал(а):что означает фраза "поддержка операций с плавающей запятой"?
То что система команд позволяет проводить операции с данными представленными в этом формате (например, умножение чисел)
ctpexhih писал(а):Меня интересует:
1) можно ли такое писать для PIC или 8051?
2) Как вообще понять, поддерживает контроллер такие операции или нет и в чем аппаратное отличие контроллеров с поддержкой таких операций и без?
3) Если контроллер не поддерживает такие операции, а они необходимы, то как обойти это ограничение?
Найдите в интернете книжки А. Фрунзе "Микроконтроллеры это же просто". Там (том 4 посвящен этой теме) есть ответы на Ваши вопросы применительно к 8051. Про пики не знаю, не знаком с набором команд (скорее всего можно даже при отсутствии таковых)

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

Добавлено: Пн окт 05, 2009 21:45:03
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) плавающая запятая поддерживалась специальной микросхемой -- арифметическим сопроцессором. Очень часто её не было для сокращения стоимости компутера -- и, тем не менее, плавающая запятая благополучно считалась. Дело в том, что все эти операции можно выполнить чисто программно, используя только команды целочисленной арифметики (другое дело, что это намного медленее). Соответствующие подпрограммы должны входить в библиотеку времени выполнения, используемую компилятором. Обычно они имеются, и поэтому, за исключением скорости, программисту, использующему язык высокого уровня (тот же Си), глубоко плевать, выполняются такие операции на уровне "железа" или же с помощью подпрограмм.

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

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

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

float A, B, Result;

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

Насколько я Вас понял, компилятор сам позаботится о том, как представить в памяти МК эти числа и как с помощью набора команд ПИКа произвести с ними требуемые операции?

Добавлено: Вт окт 06, 2009 12:26:53
SII
По идее, компилятор должен либо гарантировать выполнение написанного кода, либо внятно сказать: скомпилировать не могу, потому что работать с вещественными числами не обучен. Так что, если трансляция идёт нормально, то всё должно работать. Но гарантию я, естественно, дать не могу: не я ж этот компилятор писал, пользоваться им тоже не пользовался. Проверьте :)

Добавлено: Вт окт 06, 2009 21:14:17
BCluster
Да конечно можно. На Си разницы нет есть у проца флотинг поинт аппаратный или нет. Вопрос только в скорости вычислений.

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

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

Насколько я Вас понял, компилятор сам позаботится о том, как представить в памяти МК эти числа и как с помощью набора команд ПИКа произвести с ними требуемые операции?
Однозначно да. Это забота компилятора, а неспособный к работе с float компилятор найти непросто, и права на жизнь он не имеет.

Добавлено: Чт окт 08, 2009 04:26:36
makser
Вот только найти компилятор С с поддержкой double (с плавающей запятой двойной точности-8 байт) трудно.

Добавлено: Чт окт 08, 2009 07:34:29
SII
Более того, нельзя быть абсолютно уверенным, что тип float эквивалентен аналогичному на ПК, ну и т.д. По-хорошему, стоило бы внимательно изучить документацию на компилятор, а может, и исходники библиотечных функций, обеспечивающих работу с вещественными числами -- иначе могут быть проблемы, если какой-то расчётный алгоритм "в лоб" переносить с ПК. Конечно, вычисления с "нормальными" числами сами по себе будут вестись одинаково, но может отличаться точность, а также реакция на "нештатные" ситуации типа потери значимости.

Добавлено: Сб окт 10, 2009 18:26:11
ctpexhih
Огромное спасибо за ответы.

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

Добавлено: Вс янв 15, 2012 16:14:47
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 
Спасибо.

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

Добавлено: Вс янв 15, 2012 16:17:59
Мастер Ломастер
а вам необходимо именно на ассемблере работать с плавающей точкой?! мсье знает толк в извращениях! :)))

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

Добавлено: Вс янв 15, 2012 16:52:38
pyzhman
Не вижу в AN256 такого тестового кода.

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

Добавлено: Вс янв 15, 2012 17:24:27
Rimsky
pyzhman писал(а):Не вижу в AN256 такого тестового кода.
Нужно качнуть архив (AN526 Source Code) с исходниками к этому апноуту, в архиве файлик: FLOAT.ASM

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

Добавлено: Пн янв 16, 2012 09:57:32
МитяРа
SII писал(а):там даже целочисленное умножение-деление не всегда имеется.
Это у АВР-ок, а у МК51 умножение и деление байт-байт было всегда.. а у некоторых и двух-байтное имеется.. :tea:

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

Добавлено: Пн янв 16, 2012 10:16:33
pyzhman
2Rimsky: Шестнадцатиричное число перед EXP - мантисса. Преобразуете его в десятичный формат. И умножаете на двойку в степени, которая указана в скобках после EXP. Все, получаете десятичный формат.

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

Добавлено: Пн янв 16, 2012 16:55:59
Rimsky
pyzhman писал(а):2Rimsky: Шестнадцатиричное число перед EXP - мантисса. Преобразуете его в десятичный формат. И умножаете на двойку в степени, которая указана в скобках после EXP. Все, получаете десятичный формат.
Спасибо, разобрался :beer:

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

Добавлено: Пн янв 16, 2012 17:00:00
pyzhman
как работать с библиотекой float
Не актуально? Или защита прошла уже? :)

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

Добавлено: Пн янв 16, 2012 17:06:23
Rimsky
pyzhman писал(а):
как работать с библиотекой float
Не актуально? Или защита прошла уже? :)
Не, я отучился уже лет семь как назад. Это я для себя, для общего развития так сказать :)