Jump to content

    

Вопрос по математике с данными FLOAT в Ассемблере

В руководстве Microchip   00526  дана математика с данными float. В конце дано тестирование ее.

Я попытался применить ее не пошло, перешел к тестированию и вот что у меня вышло.

 

                call    loadAB          ; result of subtracting ACCb(EXPb)-ACCa(EXPa)->ACCb(EXPb) = 0x01FF(4) - 0x7FFF(6)

                call    F_sub           ; Here Accb = 7F7F, EXPb = 06

(0x01FF*2^4)  - (0x7FFF*2^6) =  0x7F7F*2^6 = 2088896

8176 - 2097088 = -2088912

;

                call    loadAB          ; result of multiplying ACCb(EXPb) * ACCa(EXPa)->ACCb(EXPb) = 0x01FF(4) * 0x7FFF(6)

                call    F_mpy           ; Here ACCb = FF7E, EXPb = 12

(0x01FF*2^4)  * (0x7FFF*2^6) = 0xFF7E*2^12 = 267902976

8176 * 2097088 = 17145791488

;

                call    loadAB          ; result of dividing ACCb(EXPb) / ACCa(EXPa)->ACCb(EXPb) with = 0x01FF(4) / 0x7FFF(6)

                call    F_div           ; remainder in ACCc. Here ACCb =4000, EXPb = FA (same as -6)

;                               ; & the remainder ACCc = 003F

(0x01FF*2^4)  / (0x7FFF*2^6) = 0x4000*2^6 = 1048576

8176 / 2097088 = 0.0038987395855586

Что я делаю не правильно

Share this post


Link to post
Share on other sites

Во первых, это 544-ая аппнота, а не 526-ая: http://ww1.microchip.com/downloads/en/AppNotes/00544d.pdf

Во вторых, в каком формате представлен флоат в аппноте? В стандартном виде в нем есть неявная целая часть равная 1. То есть мантисса выглядит как знак/точка/дробная часть, на самом деле это +/-1.(дробная часть).

Share this post


Link to post
Share on other sites
23 hours ago, nicmicola said:

 

                call    loadAB          ; result of dividing ACCb(EXPb) / ACCa(EXPa)->ACCb(EXPb) with = 0x01FF(4) / 0x7FFF(6)

 

                call    F_div           ; remainder in ACCc. Here ACCb =4000, EXPb = FA (same as -6)

 

;                               ; & the remainder ACCc = 003F

 

(0x01FF*2^4)  / (0x7FFF*2^6) = 0x4000*2^6 = 1048576

 

8176 / 2097088 = 0.0038987395855586

Что я делаю не правильно

В догон, если не разбираться с форматом

(0x01FF*2^4)  / (0x7FFF*2^6) = 0x4000*2^-6 = 1048576 = 0,25*0,015625 = 0,00390625

Share this post


Link to post
Share on other sites

Здравия желаю всем и персонально my504.

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

Если вас не сильно затруднит то пожалуйста  растолкуйте как пользоваться этой процедурой.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FLOAT.ASM

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00526.rar

Edited by nicmicola

Share this post


Link to post
Share on other sites

Чтобы разобраться как ей пользоваться, нужно разобрать КОД САМОЙ ФУНКЦИИ.

Собственно там все просто. При суммировании или вычитании приводится порядок одного из аргументов ко второму, а затем делают обычную арифметику с мантиссами. При умножении и делении перемножают или делят мантиссы, а порядки либо суммируют (при умножении), либо вычитают из порядка делимого порядок делителя при делении.

Ну и нужно понимать что из себя представляет дробное двоичное число с фиксированной точкой, чтобы понимать как представить результат в десятичном виде.

Что из мною сказанного Вам непонятно?

Share this post


Link to post
Share on other sites

Читайте про микрочиповский формат float24: http://ww1.microchip.com/downloads/en/AppNotes/00575.pdf

Выглядит как  xxxxxxxx  s.xxxxxxx xxxxxxxx

Старший байт - это порядок со смещением на 127(экспонента)

Средний и младший байт - это нормализованная мантисса, где s- это знак, следующие за точкой разряды - это дробная часть, а единица целой части неявная.

То есть мантисса вида 0x01FF будет равна (1+(511/32768))=1,01559448

 

Share this post


Link to post
Share on other sites
13 hours ago, my504 said:

Читайте про микрочиповский формат float24: http://ww1.microchip.com/downloads/en/AppNotes/00575.pdf

Выглядит как  xxxxxxxx  s.xxxxxxx xxxxxxxx

Старший байт - это порядок со смещением на 127(экспонента)

Средний и младший байт - это нормализованная мантисса, где s- это знак, следующие за точкой разряды - это дробная часть, а единица целой части неявная.

То есть мантисса вида 0x01FF будет равна (1+(511/32768))=1,01559448

 

Большое спасибо вам за толковое объяснение. Думаю и другим будет полезно делающим серьезные вычисления на ассемблере.

Большое спасибо вам за толковое объяснение. Думаю и другим будет полезно делающим серьезные вычисления на ассемблере.

Еще раз спасибо!!!!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this