1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Как расчитать число с плавающей точкой если целая часть ноль

Тема в разделе "WASM.A&O", создана пользователем assch, 15 янв 2017.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    130
    Например задача
    Сделать функцию которая бы число с плавающей запятой (в ассемблере с точкой)
    представила бы её значение в четырёх байтах (то есть с одинарной точностью)
    если целое число не ноль например (1.5) или (-123.456)
    то это делается без проблем
    это число нужно сформировать в 32 битах

    1 - бит знак числа
    8 - бит экспонента
    23 - бита мантиса

    где первый бит будет знаком числа
    то есть если первый бит сделать (0) то число положительное (1.5)
    а если первый бит сделать (1) то число отрицательное (-1.5)
    в следующие 8 бит нужно вписать значение экспоненты
    это тоже сделать не трудно

    если целое число 1 то в этих 8 битах прописываем число 127
    если от 2 до 4 то 128
    если от 4 до 8 то 129
    если от 8 до 16 то 130
    если от 16 до 32 то 131
    если от 32 до 64 то 132
    ...............
    ...............
    ...............
    если от 4194304 до 8 388 608 то 149

    думаю логика для експоненты где целое число не ноль понятна

    в 23 бита мантисы вписываем целую часть плюс дробную (если она есть)
    для мантисы это конечно сильно утрированное объяснение
    но я думаю тот кто поможет мне ответить на мой последующий вопрос
    хорошо знает как нужно формировать эти 23 бита в мантисе

    Ещё раз повторюсь если целое число не ноль то всё делается без проблем
    А вот если целое число ноль например 0.1 0.01 0.123 0.1234567
    то здесь формирование экспоненты и мантисы совершенно не понятно

    Если кто в теме подскажите пожалуйста
    как формировать экспоненту и мантису если целое число ноль

    В интернете я так и не нашёл ответ на этот вопрос
    там только описывается как это сделать если целое число не ноль
    то есть расклад который я утрированно описал выше
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.771
    [math]0,1234567=(-1)^{s}\cdot 2^{p-b}\cdot 1,m[/math]
    где [math]S[/math] ― знаковый бит, [math]p[/math] ― порядок, [math]b[/math] ― смещение порядка для данного формата, [math]m[/math] ― дробная часть.
    Формат в который требуется перевести ― 32 бита. Тогда мантисса 23 бита и [math]b=127[/math].
    [math]S[/math] можно найти сразу: [math]S=0[/math]. Чтобы найти [math]p[/math] требуется найти логарифм от 0,1234567 по основанию 2. Это можно сделать через MSoft Excell =LOG(число; основание).
    [math]log_{2}(0,1234567)=-3,01792[/math] округляем "вниз" до [math]-4[/math]
    [math]p-b=-4[/math]
    [math]p=123_{10}=7B_{16}=01111011_{2}[/math]
    [math]0,1234567=\frac{x}{2^{23}}\cdot 2^{-4}=\frac{x}{2^{27}}=\frac{x}{8388608}[/math]
    [math]x=0,1234567\cdot 8388608=1035629,8612736[/math]~[math] 1035630_{10}={\color{red}1}11111001101011011011110_{2}[/math]
    [math]0,1234567=S.{\color{red}p}.m=0.{\color{red}{01111011}}.11111001101011011011110_{2}=[/math]
    [math]=0{\color{red}{011.1101.1}}111.1100.1101.0110.1101.1110_{2}=3D.FC.D6.DE_{16}[/math]
     
    Последнее редактирование: 27 янв 2017
    rococo795 нравится это.
  3. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    130
    Спасибо Mikl___
    Извиняюсь, вопрос не теме
    В макросах masm32 можно делать арифметические действия, в частности деление,
    а вот какая нибудь фишка для определения остатка есть ?
    Ещё раз прошу прощения Mikl___ за вопрос не по теме
     
    Последнее редактирование модератором: 16 янв 2017
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.771
    assch,
    а причём здесь макросы?
    1. общий случай

      операциятип
      (в битах)
      делимоеделительчастноеостатокнельзя
      делить на
      AAM imm 8 на 8 в регистре AL непосредственное число
      imm от 1 до 255
      в регистре АH в регистре АL0
      div/idiv16 на 8в регистре АХв 8-битном регистре или
      8-битной ячейке памяти
      в регистре АLв регистре АH0 и АН
      32 на 16в паре
      регистров DX:AX
      в 16-битном регистре или
      16-битной ячейке памяти
      в регистре АXв регистре DX0 и DX
      64 на 32в паре
      регистров EDX:EAX
      в 32-битном регистре или
      32-битной ячейке памяти
      в регистре EАXв регистре EDX0 и EDX
      128 на 64 в паре
      регистров RDX:RAX
      в 64-битном регистре или
      64-битной ячейке памяти
      в регистре RАX в регистре RDX0 и RDX
    2. частный случай:
      если делимое [math]Y[/math], а делитель [math]X=2^{N}[/math] тогда частное [math]=Y\;SHR,N[/math] а остаток [math]=Y\;AND,(N-1)[/math]
     
    Последнее редактирование: 16 янв 2017
    rococo795 нравится это.
  5. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    130
    Просто хочу сделать одну макрофункцию
    которая бы под капотом произвела бы определённую арифметику (не оставляя следов в основном байт-коде)
    то есть как вы понимаете без участия регистров и команд процессора
    и вернула бы интересующее меня значение
    что то типа

    mov eax , @asd(параметры макроса)

    По этому я и спрашиваю (фигурально выражаясь) есть ли такой инструмент в макросах
    в котором при делении можно узнать остаток
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.036
    R=A-A/N*N
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.771
    assch,
    я не экстрасенс и по обрывкам сообщения не могу догадаться чего от меня хотят, но если требуется деление и получение остатка без команд целочисленного деления, то можно использовать:
    1. получение результата по таблице
    2. заменить деление на многократное вычитание
    3. сдвиги и вычитание
    4. умножение и сдвиги
    5. использовать FPU, SSE, SSE2
    6. и т.д.
     
  8. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    130
    Спасибо попробую
     
  9. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    130
    Всё оказалось гораздо проще
    Нашёл статью про макросы

    http://www.allasm.ru/comp_06.php

    и там нашёл оператор - MOD

    Возвращает остаток от деления операнда op1 на операнд op2

    res = op1 MOD op2

    Всем большое спасибо за подсказки
     
    _edge нравится это.
  10. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    130
    С помощью ваших подсказок за которые вам большое спасибо "Век живи век учись"
    сделал макрофункцию для своей платформы на которой я работаю - masm32 она переводит текстовое представление числа с плавающей точкой одинарной точности в текстовое десятичное число
    Если кому интересно выкладываю макрофункцию
    Большому тест-драйву я её не подвергал но вроде бы работает
    Если кто увидит ошибки поделитесь пожалуйста
    Пилотное название макрофункции незатейлевое - @NumberReal4 (число Real4)

    Код (ASM):
    1. @NumberReal4 MACRO p1:REQ
    2. local znak,buf,var,temp,mant,flag,exp,dop
    3. ;---------------------------------
    4. IF @InStr(1,<p1>,<->) EQ 0
    5. znak CATSTR <0>
    6. ELSE
    7. znak CATSTR <1>
    8. ENDIF
    9. ;---------------------------------
    10. buf CATSTR <>
    11. FORC var,<p1>
    12. IF @InStr(1,< -+>,<var>) EQ 0
    13. buf CATSTR buf,<var>
    14. ENDIF
    15. ENDM
    16. ;---------------------------------
    17. temp CATSTR %@InStr(1,<%buf>,<.>)
    18. ;---------------------------------
    19. mant CATSTR %@SubStr(<%buf>,1,temp-1)
    20. ;---------------------------------
    21. IF @SizeStr(<%mant>) GT 9
    22. .ERR <Real4  -  many symbol in integer>
    23. ENDIF
    24. ;---------------------------------
    25. buf CATSTR @SubStr(<%buf>,temp+1)
    26. ;---------------------------------
    27. IF @SizeStr(<%buf>) GT 9
    28. .ERR <Real4  -  many symbol in fractional part>
    29. ENDIF
    30. ;---------------------------------
    31. IF mant EQ 0
    32. mant CATSTR <>
    33. var CATSTR <24>
    34. goto nxt1
    35. ENDIF
    36. ;----------------------------
    37. flag CATSTR <0>
    38. temp CATSTR <>
    39. :nxt2
    40. temp CATSTR temp,%@CatStr(@CatStr(mant MOD 2))
    41. mant CATSTR %@CatStr(mant/2)
    42. IF mant EQ 0
    43. goto nxt3
    44. ENDIF
    45. flag CATSTR %@CatStr(flag+1)
    46. goto nxt2
    47. :nxt3
    48. ;----------------------------
    49. exp CATSTR %@CatStr(127+flag)
    50. ;----------------------------
    51. IF flag GT 23
    52. var CATSTR %@CatStr(flag-22)
    53. temp CATSTR @SubStr(<%temp>,var)
    54. flag CATSTR <23>
    55. var CATSTR <0>
    56. ELSE
    57. var CATSTR %@CatStr(23-flag)
    58. ENDIF
    59. ;----------------------------
    60. mant CATSTR <>
    61. REPT flag
    62. mant CATSTR mant,@SubStr(<%temp>,flag,1)
    63. flag CATSTR %@CatStr(flag-1)
    64. ENDM
    65. ;----------------------------
    66. :nxt1
    67. ;---------------------------------
    68. temp CATSTR %@SizeStr(<%buf>)
    69. ;---------------------------------
    70. IF temp EQ 1
    71. goto nxt4
    72. ENDIF
    73. ;---------------------------------
    74. :nxt5
    75. IFIDNI @SubStr(<%buf>,temp,1),<0>
    76. temp CATSTR %@CatStr(temp-1)
    77. IF temp EQ 1
    78. goto nxt4
    79. ENDIF
    80. goto nxt5
    81. ENDIF
    82. ;---------------------------------
    83. :nxt4
    84. ;---------------------------------
    85. buf CATSTR @SubStr(<%buf>,1,temp)
    86. ;---------------------------------
    87. flag CATSTR <1>
    88. REPT temp
    89. flag CATSTR flag,@CatStr(<0>)
    90. ENDM
    91. ;---------------------------------
    92. temp CATSTR <0>
    93. :nxt6
    94. IF var EQ 24
    95. temp CATSTR %@CatStr(temp+1)
    96. buf CATSTR %@CatStr(buf shl 1)
    97. IF @CatStr(buf/flag) EQ 1
    98. exp CATSTR %@CatStr(127-temp)
    99. var CATSTR <23>
    100. ENDIF
    101. buf CATSTR %@CatStr(buf MOD flag)
    102. goto nxt6
    103. ENDIF
    104. ;---------------------------------
    105. temp CATSTR <>
    106. :nxt7
    107. IF var NE 0
    108. buf CATSTR %@CatStr(buf shl 1)
    109. temp CATSTR temp,%@CatStr(buf/flag)
    110. buf CATSTR %@CatStr(buf MOD flag)
    111. var CATSTR %@CatStr(var-1)
    112. goto nxt7
    113. ENDIF
    114. ;---------------------------------
    115. buf CATSTR %@CatStr(buf shl 1)
    116. dop CATSTR %@CatStr(buf/flag)
    117. ;---------------------------------
    118. flag CATSTR <>
    119. REPT 8
    120. flag CATSTR flag,%@CatStr(@CatStr(exp MOD 2))
    121. exp CATSTR %@CatStr(exp/2)
    122. ENDM
    123. ;---------------------------------
    124. buf CATSTR <znak>
    125. ;---------------------------------
    126. var CATSTR <8>
    127. REPT 8
    128. buf CATSTR buf,@SubStr(<%flag>,var,1)
    129. var CATSTR %@CatStr(var-1)
    130. ENDM
    131. ;---------------------------------
    132. buf CATSTR buf,mant,temp,<b>
    133. ;---------------------------------
    134. var CATSTR %@CatStr(buf+dop)
    135. ;---------------------------------
    136. EXITM <var>
    137. ;---------------------------------
    138. ENDM
     
    rococo795 нравится это.
  11. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    130
    Если кому интересен алгоритм
    Тажа макрофункция но только с моими коментариями
    Код (ASM):
    1. @NumberReal4 MACRO p1:REQ
    2. local znak,buf,var,temp,mant,flag,exp,dop
    3. ;---------------------------------
    4. ; если первый символ параметра минус (-)
    5. ; значит число отрицательное
    6. ; результат запишем в макропеременную - znak
    7. ; если отрицательное запишем (1)
    8. ; если положительное запишем (0)
    9. ;---------------------------------
    10. IF @InStr(1,<p1>,<->) EQ 0
    11. znak CATSTR <0>
    12. ELSE
    13. znak CATSTR <1>
    14. ENDIF
    15. ;---------------------------------
    16. ; перепишем параметр отбросив символы пробела < >
    17. ; символ минуса <-> или символ плюса <+>
    18. ; результат запишем в макропеременную - buf
    19. ;---------------------------------
    20. buf CATSTR <>
    21. FORC var,<p1>
    22. IF @InStr(1,< -+>,<var>) EQ 0
    23. buf CATSTR buf,<var>
    24. ENDIF
    25. ENDM
    26. ;---------------------------------
    27. ; узнаем по какому смещению находится точка
    28. ; результат запишем в макропеременную - temp
    29. ;---------------------------------
    30. temp CATSTR %@InStr(1,<%buf>,<.>)
    31. ;---------------------------------
    32. ; число до точки это целое число
    33. ; результат запишем в макропеременную - mant
    34. ;---------------------------------
    35. mant CATSTR %@SubStr(<%buf>,1,temp-1)
    36. ;---------------------------------
    37. ; если число символов целого числа больше (9)
    38. ; макрос на этапе компиляции выдаст ошибку
    39. ; <Real4  -  много аргументов в целом числе>
    40. ;---------------------------------
    41. IF @SizeStr(<%mant>) GT 9
    42. .ERR <Real4  -  many symbol in integer>
    43. ENDIF
    44. ;---------------------------------
    45. ; число после точки это дробное число
    46. ; результат запишем в макропеременной - buf
    47. ;---------------------------------
    48. buf CATSTR @SubStr(<%buf>,temp+1)
    49. ;---------------------------------
    50. ; если число символов дробной части числа больше (9)
    51. ; макрос на этапе компиляции выдаст ошибку
    52. ; <Real4  -  много аргументов в дробной части>
    53. ;---------------------------------
    54. IF @SizeStr(<%buf>) GT 9
    55. .ERR <Real4  -  many symbol in fractional part>
    56. ENDIF
    57. ;---------------------------------
    58. ; анализ и обработка целого числа
    59. ; из макропеременной - mant
    60. ; если целое число ноль (0)
    61. ; то макропеременную - mant
    62. ; мы сделаем пустышкой
    63. ; а в макропеременную - var
    64. ; пропишем число (24)
    65. ; и сделаем переход на метку - nxt1
    66. ;---------------------------------
    67. IF mant EQ 0
    68. mant CATSTR <>
    69. var CATSTR <24>
    70. goto nxt1
    71. ENDIF
    72. ;----------------------------
    73. ; если целое число не ноль
    74. ; двоичное представление целого числа
    75. ; в обратном порядке
    76. ; запишем в макропеременную - temp
    77. ;----------------------------
    78. flag CATSTR <0>
    79. temp CATSTR <>
    80. :nxt2
    81. temp CATSTR temp,%@CatStr(@CatStr(mant MOD 2))
    82. mant CATSTR %@CatStr(mant/2)
    83. IF mant EQ 0
    84. goto nxt3
    85. ENDIF
    86. flag CATSTR %@CatStr(flag+1)
    87. goto nxt2
    88. :nxt3
    89. ;----------------------------
    90. ; после обработки в макропеременной - flag
    91. ; будет число символов двоичного целого числа
    92. ; минус один символ последнего бита
    93. ; это число также можно считать смещением экспоненты
    94. ; базовая экспонента (Real4) это число (127)
    95. ; прибавим к базовой экспоненте смещение
    96. ; и сохраним результат в макропеременной - exp
    97. ;----------------------------
    98. exp CATSTR %@CatStr(127+flag)
    99. ;----------------------------
    100. ; под мантису одинарной точности выделяется (23) бита
    101. ; если число смещения больше (23)
    102. ; тогда перепишем макропеременную - temp
    103. ; насколько число смещения больше числа (23)
    104. ; настолько мы и обрежем первые биты
    105. ; обратного порядка числа
    106. ; а так как число бит в мантисе
    107. ; не должно быть больше (23)
    108. ; то соответственно в макропеременную  - flag
    109. ; мы запишем (23)
    110. ; также в процессе обработки мы должны выяснить
    111. ; какое число бит в мантисе нам останется под
    112. ; двоичное представление дробной части числа
    113. ; и это число мы запишем в макропеременную  - var
    114. ; по этому если число смещения больше числа (23)
    115. ; мы запишем туда ноль (0)
    116. ; а если число смещения не больше
    117. ; тогда просто посчитаем сколько бит нам осталось
    118. ; и соответственно запишем это значение
    119. ; в макропеременную  - var
    120. ;----------------------------
    121. IF flag GT 23
    122. var CATSTR %@CatStr(flag-22)
    123. temp CATSTR @SubStr(<%temp>,var)
    124. flag CATSTR <23>
    125. var CATSTR <0>
    126. ELSE
    127. var CATSTR %@CatStr(23-flag)
    128. ENDIF
    129. ;----------------------------
    130. ; в макропеременную - mant
    131. ; перепишем двоичное представление целого числа
    132. ; уже в правильном порядке
    133. ; кроме числа первого бита
    134. ; которое если число не ноль всегда равен (1)
    135. ; и в мантисе эта единица
    136. ; по умолчанию просто представляется
    137. ; число бит находится в макропеременной - flag
    138. ;----------------------------
    139. mant CATSTR <>
    140. REPT flag
    141. mant CATSTR mant,@SubStr(<%temp>,flag,1)
    142. flag CATSTR %@CatStr(flag-1)
    143. ENDM
    144. ;----------------------------
    145. :nxt1
    146. ;---------------------------------
    147. ; будем работать с дробной частью числа
    148. ; в макропеременную - temp
    149. ; запишем сколько символов в макропеременной - buf
    150. ; это нужно только для того если в дробной чати числа
    151. ; указаны лишнии конечные нули
    152. ;---------------------------------
    153. temp CATSTR %@SizeStr(<%buf>)
    154. ;---------------------------------
    155. ; если символ всего один (1)
    156. ; то переходим на метку - nxt4
    157. ;---------------------------------
    158. IF temp EQ 1
    159. goto nxt4
    160. ENDIF
    161. ;---------------------------------
    162. ; если символов больше чем один то начиная с конца
    163. ; будем искать конечные лишнии нули
    164. ; если нулей нет то символы переменной не изменятся
    165. ; если есть то символы уменьшатся на количество нулей
    166. ; но в любом случае должно остатся
    167. ; не меньше одного символа
    168. ;---------------------------------
    169. :nxt5
    170. IFIDNI @SubStr(<%buf>,temp,1),<0>
    171. temp CATSTR %@CatStr(temp-1)
    172. IF temp EQ 1
    173. goto nxt4
    174. ENDIF
    175. goto nxt5
    176. ENDIF
    177. ;---------------------------------
    178. :nxt4
    179. ;---------------------------------
    180. ; на основе значения макропеременной - temp
    181. ; перепишем данные в макропеременной - buf
    182. ;---------------------------------
    183. buf CATSTR @SubStr(<%buf>,1,temp)
    184. ;---------------------------------
    185. ; зная значение числа макропеременной - temp
    186. ; мы каждый раз к текстовой единице
    187. ; будем в конце приписывать ноль (0)
    188. ; тем самым сформируем число деления дробной части
    189. ; и запишем это число в макропеременную - flag
    190. ;---------------------------------
    191. flag CATSTR <1>
    192. REPT temp
    193. flag CATSTR flag,@CatStr(<0>)
    194. ENDM
    195. ;---------------------------------
    196. ; если макропеременная - var
    197. ; равна (24)
    198. ; значит целая часть числа равна нулю (0)
    199. ; в этом случае нам нужно будет искать число
    200. ; смещения экспоненты в отрицательную сторону
    201. ; для этого нам нужно будет начать
    202. ; раскладывать дробное число на двоичные разряды
    203. ; до тех пор пока не встретится первая единица (1)
    204. ; каким символом по счёту будет первая единица (1)
    205. ; такое и будет число смещения экспоненты
    206. ; это число отнимем от базовой экспоненты (127)
    207. ; и у нас получится отрицательная экспонента
    208. ; результат мы запишем в макропеременную - exp
    209. ; после отработки этого условия
    210. ; разложение дробной части числа на двоичные разряды
    211. ; и запись этих разрядов в мантису
    212. ; продолжится сразу же после этой первой единицы (1)
    213. ; мантису мы должны заполнить по полной
    214. ; то есть все её (23) бита
    215. ; по этому в этом условии при нахождении единицы (1)
    216. ; в макропеременную - var
    217. ; мы запишем число (23)
    218. ;---------------------------------
    219. temp CATSTR <0>
    220. :nxt6
    221. IF var EQ 24
    222. temp CATSTR %@CatStr(temp+1)
    223. buf CATSTR %@CatStr(buf shl 1)
    224. IF @CatStr(buf/flag) EQ 1
    225. exp CATSTR %@CatStr(127-temp)
    226. var CATSTR <23>
    227. ENDIF
    228. buf CATSTR %@CatStr(buf MOD flag)
    229. goto nxt6
    230. ENDIF
    231. ;---------------------------------
    232. ; в макропеременную - temp
    233. ; запишем дробную часть числа в двоичном формате
    234. ; но запишем ровно столько бит
    235. ; сколько указано в значении макропеременной - var
    236. ;---------------------------------
    237. temp CATSTR <>
    238. :nxt7
    239. IF var NE 0
    240. buf CATSTR %@CatStr(buf shl 1)
    241. temp CATSTR temp,%@CatStr(buf/flag)
    242. buf CATSTR %@CatStr(buf MOD flag)
    243. var CATSTR %@CatStr(var-1)
    244. goto nxt7
    245. ENDIF
    246. ;---------------------------------
    247. ; у дробной части числа
    248. ; сверх отведённого лимита проверим следующий бит
    249. ; двоичное значение этого бита (0) или (1)
    250. ; запишем в макропеременную - dop
    251. ; в конце мы к десятичному результату
    252. ; прибавим это значение к конечному результату
    253. ; то есть как бы округлим если бит (1)
    254. ; или нет если бит (0)
    255. ;---------------------------------
    256. buf CATSTR %@CatStr(buf shl 1)
    257. dop CATSTR %@CatStr(buf/flag)
    258. ;---------------------------------
    259. ; в двоичном формате в обратном порядке
    260. ; запишем экспоненту в макропеременную - flag
    261. ; для экспоненты выделяется восемь символов (8 бит)
    262. ;---------------------------------
    263. flag CATSTR <>
    264. REPT 8
    265. flag CATSTR flag,%@CatStr(@CatStr(exp MOD 2))
    266. exp CATSTR %@CatStr(exp/2)
    267. ENDM
    268. ;---------------------------------
    269. ; здесь будем собирать результат (32 бита)
    270. ; в макропеременную - buf
    271. ; сначала запишем первый бит знака
    272. ; из макропеременной - znak
    273. ;---------------------------------
    274. buf CATSTR <znak>
    275. ;---------------------------------
    276. ; потом добавим восемь бит
    277. ; экспоненты в правильном порядке
    278. ;---------------------------------
    279. var CATSTR <8>
    280. REPT 8
    281. buf CATSTR buf,@SubStr(<%flag>,var,1)
    282. var CATSTR %@CatStr(var-1)
    283. ENDM
    284. ;---------------------------------
    285. ; после припишем мантису (23 бита)
    286. ; она будет состоять из двоичных данных
    287. ; целого числа из макропеременной - mant
    288. ; и двоичных данных дробной части
    289. ; которые были записаны на оставшихся битах
    290. ; из макропеременной - temp
    291. ; и в конце по правилам синтаксиса
    292. ; для двоичного числа припишем постфикс <b>
    293. ;---------------------------------
    294. buf CATSTR buf,mant,temp,<b>
    295. ;---------------------------------
    296. ; полученное 32 битное двоичное значение числа
    297. ; по умолчанию переведём в десятичный формат
    298. ; и прибавим к результату дополнительное число
    299. ; если дополнительное число (1)
    300. ; то результат прибавится на единицу
    301. ; а если дополнительное число (0)
    302. ; то мы к результату прибавим просто ноль
    303. ; результат пропишем в макропеременную - var
    304. ;---------------------------------
    305. var CATSTR %@CatStr(buf+dop)
    306. ;---------------------------------
    307. ; на выходе макрофункция вернёт десятичное число
    308. ; указанного в параметре числа с плавающей точкой
    309. ;---------------------------------
    310. EXITM <var>
    311. ;---------------------------------
    312. ENDM
     
    rococo795 нравится это.
  12. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    130
    В макросе - @NumberReal4 нашёл небольшие ошибки
    из за которых в некоторых случаях не коректно отрабатывается алгоритм
    сам я изменить пост № 10 и № 11 не могу по этому если кому надо
    выставляю ссылку

    https://yadi.sk/d/dXBlunel3CyfFG

    там файл в котором исправленный алгоритм макроса
    плюс тот же макрос с коментариями
     
    rococo795 нравится это.