Страница 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 умножение и деление байт-байт было всегда.. а у некоторых и двух-байтное имеется..

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

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

Re: Операции с плавающей запятой
Добавлено: Пн янв 16, 2012 17:06:23
Rimsky
pyzhman писал(а):как работать с библиотекой float
Не актуально? Или защита прошла уже?

Не, я отучился уже лет семь как назад. Это я для себя, для общего развития так сказать
