<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=170315&amp;view=findpost&amp;p=1443499</guid>
        <pubDate>Wed, 07 Feb 2007 02:36:58 +0000</pubDate>
        <title>Числа с плавающей точкой</title>
        <link>https://forum.sources.ru/index.php?showtopic=170315&amp;view=findpost&amp;p=1443499</link>
        <description><![CDATA[AndNot: <strong class='tag-b'>adrax</strong>, при выводе на экран и используют промежуточную BCD форму. А если extended напрямую анализировать, то сложность кода возрастет на порядок. Тебе это надо?]]></description>
        <author>AndNot</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=170315&amp;view=findpost&amp;p=1443416</guid>
        <pubDate>Tue, 06 Feb 2007 21:28:34 +0000</pubDate>
        <title>Числа с плавающей точкой</title>
        <link>https://forum.sources.ru/index.php?showtopic=170315&amp;view=findpost&amp;p=1443416</link>
        <description><![CDATA[adrax: Дело в том, что если выводить в экспоненциальном (научном формате), то я могу просто тупо перебить кусок готового кода, но меня интересует именно вывод в привычном виде - с точкой (ну или запятой)<br>
<br>
<strong class='tag-b'>leo</strong><br>
Точно&#33; Я ж не в BCD, я ж в extended&#33;&#33; Хотя всё равно не понимаю - как мне проанализировать тип extended, чтобы определить десятичный порядок и правильно пихнуть запятую... sprintf с %e не предлагайте, пжлст, лучше дайте пошаговое описание разбора extended-числа (про BCD нашёл статью &quot;Арифметика с плавающей точкой&quot;, там рассказывается в формулах, и реализацию просто сделать на любом языке) - каков алгоритм?]]></description>
        <author>adrax</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=170315&amp;view=findpost&amp;p=1442652</guid>
        <pubDate>Tue, 06 Feb 2007 13:26:36 +0000</pubDate>
        <title>Числа с плавающей точкой</title>
        <link>https://forum.sources.ru/index.php?showtopic=170315&amp;view=findpost&amp;p=1442652</link>
        <description><![CDATA[AndNot: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=170315&view=findpost&p=1442073'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2007-02-06T07:55:35+00:00">06.02.07, 07:55</time></span><div class='quote '>Поэтому если предварительно не анализировать порядок числа, то задавать большое число знаков после запятой не стоит </div></div><br>
Это уже тонкости, и остается только добавить, что если не получается вывести в формате с плавающей точкой, то можно попытаться вывести в научной форме. Но там немного посложнее.]]></description>
        <author>AndNot</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=170315&amp;view=findpost&amp;p=1442073</guid>
        <pubDate>Tue, 06 Feb 2007 07:55:35 +0000</pubDate>
        <title>Числа с плавающей точкой</title>
        <link>https://forum.sources.ru/index.php?showtopic=170315&amp;view=findpost&amp;p=1442073</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=170315&view=findpost&p=1440476'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>adrax &#064; <time class="tag-quote__quoted-time" datetime="2007-02-04T23:46:29+00:00">04.02.07, 23:46</time></span><div class='quote '>положил число в переменную num10 типа tbyte (это BCD формат, я так понял?) </div></div><br>
Смотря как &quot;положил&quot;  :D<br>
fstp tbyte [num10] - сохраняет число в двоичном extended формате с плав.точкой<br>
fbstp tbyte [num10] - округляет число до целого и сохраняет в упакованном BCD-формате<br>
В первых (младших) 9 байтах хранятся 2*9=18 десятичных цифр числа - по 4 бита на цифру. Старший (знаковый) бит 10-го байта хранит знак числа.<br>
Для преобразования числа в строку с фикс.числом знаков после запятой нужно, как уже сказал <strong class='tag-b'>AndNot</strong>, сначала умножить число на степень 10 в соответствии с требуемым числом знаков и выгрузить в BCD, а затем &quot;ковыряться&quot; с разбором этого BCD и формированием строки с учетом отбрасывания лидирующих нулей целой части и вставки разделительной точки на нужную позицию<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=170315&view=findpost&p=1440987'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>AndNot &#064; <time class="tag-quote__quoted-time" datetime="2007-02-05T10:53:36+00:00">05.02.07, 10:53</time></span><div class='quote '>Точка будет там, где ты этого захочешь<br>
после запятой может быть от 0 до 17 знаков</div></div><br>
Не совсем так. Общее число знаков целой и дробной части не может быть больше 18-ти, иначе получишь переполнение. Поэтому если предварительно не анализировать порядок числа, то задавать большое число знаков после запятой не стоит ;)]]></description>
        <author>leo</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=170315&amp;view=findpost&amp;p=1440987</guid>
        <pubDate>Mon, 05 Feb 2007 10:53:36 +0000</pubDate>
        <title>Числа с плавающей точкой</title>
        <link>https://forum.sources.ru/index.php?showtopic=170315&amp;view=findpost&amp;p=1440987</link>
        <description><![CDATA[AndNot: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=170315&view=findpost&p=1440476'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>adrax &#064; <time class="tag-quote__quoted-time" datetime="2007-02-04T23:46:29+00:00">04.02.07, 23:46</time></span><div class='quote '>положил число в переменную num10 типа tbyte (это BCD формат, я так понял?) </div></div><br>
TBYTE - это не обязательно BCD ;) Это просто 10-ть байт :) А уж как ты их будешь трактовать в программе, чисто твое дело.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=170315&view=findpost&p=1440476'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>adrax &#064; <time class="tag-quote__quoted-time" datetime="2007-02-04T23:46:29+00:00">04.02.07, 23:46</time></span><div class='quote '>но как определить десятичный порядок и правильно поставить разделитель-точку?</div></div><br>
Ничего определять не надо. Точка будет там, где ты этого захочешь.<br>
Попробую объяснить на самом простом (и быстром) способе - табличном.<br>
Ну во первых известно, что после запятой может быть от 0 до 17 знаков. Вот и заведи таблицу:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">; 10 в степени N</div><div class="code_line">tenexp:</div><div class="code_line">&nbsp;&nbsp;dq 1.0E1, 1.0E2, 1.0E3, 1.0E4, 1.0E5, 1.0E6, 1.0E7, 1.0E8</div><div class="code_line">&nbsp;&nbsp;dq 1.0E9, 1.0E10, 1.0E11, 1.0E12, 1.0E13, 1.0E14, 1.0E15, 1.0E16</div><div class="code_line">&nbsp;&nbsp;dq 1.0E17</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Т.е. массив состоит из заранее вычисленных коэффициентов 10 в степени от 1 до 17.<br>
Во вторых, поскольку при сохранении числа со стека сопроцессора в BCD происходит округление до целого, то прежде чем сохранять, его нужно масштабировать. А если по русски, то, к примеру, есть число 2222,3334444. Тебе нужно вывести его на экран (или куда там еще :-) в виде: 2222,333. Но поскольку при сохранении в BCD ты получишь число 2222, то необходимо еще до сохранения преобразовать его к виду 2222333,444. Это можно сделать умножив исходное число на 10^3 (поскольку нужно 3 числа после запятой, то и степень будет равна 3). Вот здесь то и пригодится массив tenexp  :yes: А дальше при преобразовании BCD в строку просто вставляешь точку там где ее и заказывали. И все.<br>
Пробуй, если не получится - поможем :)]]></description>
        <author>AndNot</author>
        <category>Assembler</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=170315&amp;view=findpost&amp;p=1440476</guid>
        <pubDate>Sun, 04 Feb 2007 23:46:29 +0000</pubDate>
        <title>Числа с плавающей точкой</title>
        <link>https://forum.sources.ru/index.php?showtopic=170315&amp;view=findpost&amp;p=1440476</link>
        <description><![CDATA[adrax: Уважаемые программисты&#33; Понимаю, что тема избита, но - если ввод и преобразование числа я ещё понял, то с выводом возникли проблемы. Вот как я принимаю число:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">format PE console</div><div class="code_line">include &#39;win32axp.inc&#39;</div><div class="code_line">&nbsp;</div><div class="code_line">.data</div><div class="code_line">ns dd ?</div><div class="code_line">hout dd ?</div><div class="code_line">buffer db 51 dup (?)</div><div class="code_line">help db &#39;Usage: con_4islo.exe NUMBER&#39;,0</div><div class="code_line">Retry db &#39;Program fails. Please, retry&#39;,0</div><div class="code_line">num10 dt ?</div><div class="code_line">chislo dd ?</div><div class="code_line">ten dd 10</div><div class="code_line">minus db ?</div><div class="code_line">status dw ?</div><div class="code_line">to4ka dd ?</div><div class="code_line">&nbsp;</div><div class="code_line">.code</div><div class="code_line">fuck:</div><div class="code_line">invoke GetStdHandle,STD_OUTPUT_HANDLE</div><div class="code_line">mov [hout],eax</div><div class="code_line">invoke GetCommandLine</div><div class="code_line">mov esi,eax</div><div class="code_line">cycle1:</div><div class="code_line">&nbsp;cmp byte [esi],20h</div><div class="code_line">&nbsp;je parameter</div><div class="code_line">&nbsp;cmp byte [esi],0Dh</div><div class="code_line">&nbsp;je najobka</div><div class="code_line">&nbsp;inc esi</div><div class="code_line">&nbsp;jmp cycle1</div><div class="code_line">parameter:</div><div class="code_line">&nbsp;mov edi,buffer</div><div class="code_line">&nbsp;mov ecx,50</div><div class="code_line">&nbsp;&nbsp; cycle2:</div><div class="code_line">&nbsp;&nbsp; &nbsp; inc esi</div><div class="code_line">&nbsp;&nbsp; &nbsp; mov al,byte [esi]</div><div class="code_line">&nbsp;&nbsp; &nbsp; cmp al,0Dh</div><div class="code_line">&nbsp;&nbsp; &nbsp; je konets</div><div class="code_line">&nbsp;&nbsp; &nbsp; mov byte [edi],al</div><div class="code_line">&nbsp;&nbsp; &nbsp; inc edi</div><div class="code_line">&nbsp;&nbsp; &nbsp; loop cycle2</div><div class="code_line">&nbsp;</div><div class="code_line">konets:</div><div class="code_line">invoke lstrlen,buffer</div><div class="code_line">mov ecx,eax</div><div class="code_line">mov esi,buffer</div><div class="code_line">mov edi,esi</div><div class="code_line">add edi,ecx</div><div class="code_line">dec edi</div><div class="code_line">xor eax,eax</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">finit</div><div class="code_line">fldz</div><div class="code_line">mov al,byte [esi]</div><div class="code_line">cmp al,2Dh</div><div class="code_line">je otric</div><div class="code_line">cycle3:</div><div class="code_line">&nbsp;&nbsp;mov al,byte [esi]</div><div class="code_line">&nbsp;&nbsp;inc esi</div><div class="code_line">&nbsp;&nbsp;cmp al,2Eh</div><div class="code_line">&nbsp;&nbsp;je drobnoe</div><div class="code_line">&nbsp;&nbsp;cmp al,2Ch</div><div class="code_line">&nbsp;&nbsp;je drobnoe</div><div class="code_line">&nbsp;&nbsp;sub al,30h</div><div class="code_line">&nbsp;&nbsp;jb retry</div><div class="code_line">&nbsp;&nbsp;cmp al,9</div><div class="code_line">&nbsp;&nbsp;ja retry</div><div class="code_line">&nbsp;&nbsp;mov [chislo],eax</div><div class="code_line">&nbsp;&nbsp;fild [ten]</div><div class="code_line">&nbsp;&nbsp;fmulp st1,st</div><div class="code_line">&nbsp;&nbsp;fild [chislo]</div><div class="code_line">&nbsp;&nbsp;faddp st1,st</div><div class="code_line">&nbsp;&nbsp;loop cycle3</div><div class="code_line">&nbsp;fldz</div><div class="code_line">&nbsp;jmp NoMore</div><div class="code_line">&nbsp;</div><div class="code_line">drobnoe:</div><div class="code_line">&nbsp;&nbsp;dec ecx</div><div class="code_line">&nbsp;&nbsp;xor eax,eax</div><div class="code_line">&nbsp;&nbsp;fldz</div><div class="code_line">&nbsp;cycle4:</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov al,byte [edi]</div><div class="code_line">&nbsp;&nbsp; &nbsp;dec edi</div><div class="code_line">&nbsp;&nbsp; &nbsp;sub al,30h</div><div class="code_line">&nbsp;&nbsp; &nbsp;jb retry</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp al,9</div><div class="code_line">&nbsp;&nbsp; &nbsp;ja retry</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov [chislo],eax</div><div class="code_line">&nbsp;&nbsp; &nbsp;fild [chislo]</div><div class="code_line">&nbsp;&nbsp; &nbsp;faddp</div><div class="code_line">&nbsp;&nbsp; &nbsp;fild [ten]</div><div class="code_line">&nbsp;&nbsp; &nbsp;fdivp st1,st</div><div class="code_line">&nbsp;&nbsp; &nbsp;loop cycle4</div><div class="code_line">&nbsp;</div><div class="code_line">NoMore:</div><div class="code_line">&nbsp;&nbsp;faddp st1,st</div><div class="code_line">&nbsp;&nbsp;xor eax,eax</div><div class="code_line">&nbsp;&nbsp;mov al,[minus]</div><div class="code_line">&nbsp;&nbsp;test al,al</div><div class="code_line">&nbsp;&nbsp;jz zagruz</div><div class="code_line">&nbsp;&nbsp;fchs</div><div class="code_line">zagruz:</div><div class="code_line">&nbsp;&nbsp;fstp tbyte [num10]</div><div class="code_line">exit:</div><div class="code_line">invoke ExitProcess,0</div><div class="code_line">&nbsp;</div><div class="code_line">najobka:</div><div class="code_line">&nbsp;invoke WriteConsole,[hout],help,27,ns,NULL</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">retry:</div><div class="code_line">&nbsp;invoke WriteConsole,[hout],Retry,28,ns,NULL</div><div class="code_line">&nbsp;jmp exit</div><div class="code_line">&nbsp;</div><div class="code_line">otric:</div><div class="code_line">mov [minus],1</div><div class="code_line">dec ecx</div><div class="code_line">inc esi</div><div class="code_line">jmp cycle3</div><div class="code_line">&nbsp;</div><div class="code_line">.end fuck</div></ol></div></div></div></div><br>
И вот, я положил число в переменную num10 типа tbyte (это BCD формат, я так понял?) - я в принципе могу грузануть её обратно в стек FPU, провести необходимые арифметические операции, но как мне преобразовать это число в строку?<br>
Пожалуйста, не отсылайте меня к масмовским либам, а поясните хотя бы в общих словах алгоритм разбора BCD. Я, наверное, сам смогу вывести цифры в строку, но как определить десятичный порядок и правильно поставить разделитель-точку?<br>
Прошу вашей помощи]]></description>
        <author>adrax</author>
        <category>Assembler</category>
      </item>
	
      </channel>
      </rss>
	