<?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=285453&amp;view=findpost&amp;p=2802029</guid>
        <pubDate>Fri, 14 Jan 2011 05:28:49 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2802029</link>
        <description><![CDATA[tasman: возведение в степень можно реализовать методом последовательного возведения в квадрат алгоритм есть в книге Кормен Т., Лейзерсон Ч., Ривест Р. — Алгоритмы: построение и анализ, но там по модулю, можно подправить и будет работать. но для этого нужно перевести степень в бинарную систему. могу выложить алгоритм из книжки...]]></description>
        <author>tasman</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2746933</guid>
        <pubDate>Mon, 08 Nov 2010 14:01:50 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2746933</link>
        <description><![CDATA[ujhgj: Приветствую&#33;<br>Вы делаете доброе дело. Я уже сбился с ног выискиваю путный модуль длинной арифметики.<br>У меня два вопроса:<br>1) модуль здесь только в виде исходный кодов, целиком скачать можно?<br>2) авторам известны другие реализации длинной арифметики? - какие, и как они в сравнении с этим модулем?]]></description>
        <author>ujhgj</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2639504</guid>
        <pubDate>Wed, 07 Jul 2010 20:01:37 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2639504</link>
        <description><![CDATA[Navi1982: В делении сделал некоторые изменения:<br>1. обработка деления на ноль.<br>2. устранил ошибку, дающая в результяте деления 0 в случаях, когда делитель был больше 2^32-1 (т.е. в массиве занимал более 1-го разряда). (см. коментарий)<br>3. прокоментировал действия в делении.<br><br>Сожалею, что опубликовал деление не доконца протестив его.  :blush:]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2615661</guid>
        <pubDate>Tue, 08 Jun 2010 20:19:18 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2615661</link>
        <description><![CDATA[Navi1982: Создал тему в которой выложил заготовку всего модуля... Вот ее <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=305393&view=findpost&p=2612689' target='_blank'>ссылка</a><br>
<br>
Только есть просьба - не пишите там коментарии... лучше их отписывайте сюды и почитайте правила темы.  :thanks:]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2612178</guid>
        <pubDate>Thu, 03 Jun 2010 21:08:26 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2612178</link>
        <description><![CDATA[Navi1982: Ну, вот и написал деление... Правда по модулю. Так-же я знаю, сдесь есть несколько уязвимых мест и даже есть где оптимизировать, чтоб быстрей считало... Но пока на работе мучают - не могу сконцентрироватся как следует. То же самое и с умножением... Для быстрого умножения щас кучу методов придумали - самым быстрым на сегодня считается &quot;Faster Integer Multiplication&quot; от Мартина Фюрера. Кому интересно может почитать: <a class='tag-url' href='http://www.cse.psu.edu/~furer/Papers/mult.pdf' target='_blank'>FIM Martin Furer</a><br>
Буду очень признателен, кто поможет его реализовать на дельфи.<br>
<br>
Ну и ниже привожу свое деление по модулю...<br>
Это вспомогательная функция:<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">{Функция сдвига разрядов в старшую сторону}</div><div class="code_line">Function HIShl(const op:THugeInt; n:integer):THugeInt;</div><div class="code_line">Var i,sg:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if n&#60;0 then n:=0;</div><div class="code_line">&nbsp;&nbsp;if op.flag&#60;0 then sg:=-1 else sg:=1;</div><div class="code_line">&nbsp;&nbsp;result.flag:=abs(op.flag)+n*sg;</div><div class="code_line">&nbsp;&nbsp;SetLength(result.data,abs(result.flag));</div><div class="code_line">&nbsp;&nbsp;for i:=0 to abs(op.flag)-1 do result.data[i+n]:=op.data[i];</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
И само деление по модулю...<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">{Функция деления по модулю без остатка op1 DIV op2}</div><div class="code_line">{разряд результата угадывается по методу дихотомии}</div><div class="code_line">Function HIModDiv(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,len1:integer;</div><div class="code_line">&nbsp;&nbsp;r,t,y,rHI:THugeInt;</div><div class="code_line">&nbsp;&nbsp;rk:longword;</div><div class="code_line">&nbsp;&nbsp;base32,r64,x1,x2:Int64;</div><div class="code_line">begin</div><div class="code_line">&nbsp;//учтем деление на ноль!</div><div class="code_line">&nbsp;&nbsp;t.flag:=1; SetLength(t.data,t.flag); // t=0;</div><div class="code_line">&nbsp;&nbsp;t.data[t.flag-1]:=0;</div><div class="code_line">&nbsp;if HICompare(t,op2)&#60;&#62;0 then //op2&#60;&#62;0 ? //иначе result=nil &#60;=&#62; бесконечность</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;base32:=0000000; //2^32</div><div class="code_line">&nbsp;&nbsp;len1:=abs(op1.flag); //&quot;лишнее наследство&quot; //вобщем: проход начнем со старших разрядов делимого,</div><div class="code_line">&nbsp;&nbsp;i:=len1; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//добавляя в промежуточное делимое по одному разряду справа...</div><div class="code_line">&nbsp;&nbsp;r.flag:=0; SetLength(r.data,r.flag); // r=nil обнуляем часное</div><div class="code_line">&nbsp;&nbsp;t.flag:=0; SetLength(t.data,t.flag); // t=nil обнуляем промежуточное делимое</div><div class="code_line">&nbsp;&nbsp;while i&#62;0 do &nbsp; &nbsp; &nbsp; &nbsp;//...пока не дойдем до последнего разряда из делимого!</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:=HIShl(t,1); &nbsp; &nbsp;//Т.е. в промежуточном делимом сдвигаем разряды влево (умножаем на базу 2^32),</div><div class="code_line">&nbsp;&nbsp; &nbsp;HICorrection(t); &nbsp;//убеждаемся что после такой процедуры неокажется &quot;левых&quot; нолей,</div><div class="code_line">&nbsp;&nbsp; &nbsp;t.data[0]:=op1.data[i-1]; //и &quot;прибавляем&quot; разряд справа от делимого.</div><div class="code_line">&nbsp;&nbsp; &nbsp;//gues r[k] - начинаем угадывание разряда в часном (макс.подх.знач.) по дихотомии...</div><div class="code_line">&nbsp;&nbsp; &nbsp;x1:=0; x2:=base32; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//...в отрезке 0..2^32</div><div class="code_line">&nbsp;&nbsp; &nbsp;r64:=(x1+x2) div 2; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //делим отрезок на две половины</div><div class="code_line">&nbsp;&nbsp; &nbsp;rk:=Int64Rec(r64).Lo; &nbsp; &nbsp; &nbsp; //rk и есть текущий разряд в часном и = только что вычесленной середине отрезка.</div><div class="code_line">&nbsp;&nbsp; &nbsp;rHI.flag:=1; SetLength(rHI.data,rHI.flag); //временная переменная THugeInt для rk</div><div class="code_line">&nbsp;&nbsp; &nbsp;while x1&#60;&#62;rk do &nbsp; //будим разделять отрезки пока x1&#60;&#62;rk</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; rHI.data[0]:=rk;</div><div class="code_line">&nbsp;&nbsp; &nbsp; y:=HIModMul(rHI,op2);//rk*делитель</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//теперь проверим в каком отрезке находится</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//максимально подходящее значение для rk (текущего разряда часного)</div><div class="code_line">&nbsp;&nbsp; &nbsp; if HICompare(t,y)&#62;=0 then x1:=rk else x2:=rk; //If t&#62;=y Then [значение в старшем отр.] else [младшем]</div><div class="code_line">&nbsp;&nbsp; &nbsp; r64:=(x1+x2) div 2; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //и выбраный отрезок снова на пополам</div><div class="code_line">&nbsp;&nbsp; &nbsp; rk:=Int64Rec(r64).Lo; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //rk=середина отрезка.</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;rHI.data[0]:=rk; &nbsp; &nbsp; &nbsp;//Эта строка раньше отсувствовала: &quot;баг подкрался незаметно&quot; ;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;y:=HIModMul(rHI,op2); // y=[текущий разряд часного]*[делитель]</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:=HIModSub(t,y); &nbsp; &nbsp; // [промежуточное делимое]=[промежуточное делимое]-y</div><div class="code_line">&nbsp;&nbsp; &nbsp;HICorrection(t); &nbsp; &nbsp; &nbsp;// убираем &quot;левые&quot; ноли, если имеются.</div><div class="code_line">&nbsp;&nbsp; &nbsp;r:=HIShl(r,1); &nbsp; &nbsp; &nbsp; &nbsp;// фиксируем часное умножая его на базу</div><div class="code_line">&nbsp;&nbsp; &nbsp;r.data[0]:=rk; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;и &quot;прибавим&quot; только что вычеслиный разряд</div><div class="code_line">&nbsp;&nbsp; &nbsp;dec(i); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // опускаем следующий разряд делимого справа к промежуточному</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;HICorrection(r); &nbsp;// в результате могут оказаться ноли и мы их почистим кроме значемого</div><div class="code_line">&nbsp;end else //if op2=0 =&#62; r=nil ! or infinite (см. в начало)</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;r.flag:=0; SetLength(r.data,r.flag); // r=nil</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;result:=r;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
А это уже с учетом знака (по аналогии умножения со знаком - см. посты выше):<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">{Функция деления op1 DIV op2 со знаком}</div><div class="code_line">Function HIDiv(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var f1,f2,m:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;f1:=op1.flag;</div><div class="code_line">&nbsp;&nbsp;f2:=op2.flag;</div><div class="code_line">&nbsp;&nbsp;m:=0;</div><div class="code_line">&nbsp;&nbsp;if (f1&#62;0)and(f2&#62;0) then m:=1 else</div><div class="code_line">&nbsp;&nbsp; if (f1&#60;0)and(f2&#60;0) then m:=1 else</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (f1&#62;0)and(f2&#60;0) then m:=-1 else</div><div class="code_line">&nbsp;&nbsp; &nbsp; if (f1&#60;0)and(f2&#62;0) then m:=-1;</div><div class="code_line">&nbsp;&nbsp;result:=HIModDiv(op1,op2);</div><div class="code_line">&nbsp;&nbsp;result.flag:=result.flag*m;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2607563</guid>
        <pubDate>Sat, 29 May 2010 14:09:22 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2607563</link>
        <description><![CDATA[Navi1982: Тра-та-та-та, та-та&#33;  :whistle: <br>
Всем привет&#33;&#33;&#33;  :victory: Сколько лет сколько зим меня носило по командировкам... Но я так сказать: с корабля - на бал. Неуспел вернутся из командировки, так уже запрегли на реконструкцию старой ТВ-сети в соседнем городке. Вот, уже 2 недели как отпахал с утра до темна... еще месяц осталось. :hang: Да что я все о себе да и о себе?&#33;... Я главное хотел сказать - продвигаюсь дальше по программированию модуля... Вот за вчера и сегодня напрогал функции умножения по модулю и со знаком.  :blush: <br>
<br>
Предаю вашему вниманию и вашей критике:<br>
<strong class='tag-b'>это у меня умножение по модулю:</strong><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">{Функция умножения по модулю}</div><div class="code_line">Function HIModMul(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,j,len1,len2:integer;</div><div class="code_line">&nbsp;&nbsp;t:Int64;</div><div class="code_line">&nbsp;&nbsp;cr:array [0..1] of cardinal absolute t;</div><div class="code_line">&nbsp;&nbsp;rp,r:THugeInt; //rp - is precedent result of multiply</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;len1:=abs(op1.flag);</div><div class="code_line">&nbsp;&nbsp;len2:=abs(op2.flag);</div><div class="code_line">&nbsp;&nbsp;//begin rp:=0;</div><div class="code_line">&nbsp;&nbsp;rp.flag:=1; SetLength(rp.data,rp.flag);</div><div class="code_line">&nbsp;&nbsp;rp.data[rp.flag-1]:=0; //end rp:=0;</div><div class="code_line">&nbsp;&nbsp;j:=0;</div><div class="code_line">&nbsp;&nbsp;while j&#60;len2 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;i:=0; t:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//begin r:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(r.data,0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(r.data,len1+j+1); //size of op1.data + shift + 1 elem of .data</div><div class="code_line">&nbsp;&nbsp; &nbsp;//end r:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;r.flag:=0+j;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while i&#60;len1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op2.data[j])*int64(op1.data[i])+t;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc(r.flag); //SetLength(r.data,r.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;r.data[r.flag-1]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc(r.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;r.data[r.flag-1]:=t;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//Add r with rp</div><div class="code_line">&nbsp;&nbsp; &nbsp;r:=HIModAdd(r,rp);</div><div class="code_line">&nbsp;&nbsp; &nbsp;//begin rp:=r;</div><div class="code_line">&nbsp;&nbsp; &nbsp;rp.flag:=r.flag; SetLength(rp.data,rp.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp;rp.data:=Copy(r.data); //end rp:=r;</div><div class="code_line">&nbsp;&nbsp; &nbsp;inc(j);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;HICorrection(rp); // убирает незначемые нулевые элементы из массива числа, если присувствуют</div><div class="code_line">&nbsp;&nbsp;result:=rp;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>А это умножение с учетом знака:</strong><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">{Функция умножения со знаком}</div><div class="code_line">Function HIMul(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var f1,f2,m:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;f1:=op1.flag;</div><div class="code_line">&nbsp;&nbsp;f2:=op2.flag;</div><div class="code_line">&nbsp;&nbsp;m:=0;</div><div class="code_line">&nbsp;&nbsp;if (f1&#62;0)and(f2&#62;0) then m:=1 else</div><div class="code_line">&nbsp;&nbsp; if (f1&#60;0)and(f2&#60;0) then m:=1 else</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (f1&#62;0)and(f2&#60;0) then m:=-1 else</div><div class="code_line">&nbsp;&nbsp; &nbsp; if (f1&#60;0)and(f2&#62;0) then m:=-1;</div><div class="code_line">&nbsp;&nbsp;result:=HIModMul(op1,op2);</div><div class="code_line">&nbsp;&nbsp;result.flag:=result.flag*m;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
А еще мечтаю написать деление, но быстрое... допустимо раза в 3 медленее умножения. А то если вспоминать мою старую String&#39;овую версию деления, то там если поделить xxx...xxx длинное число на, скажем 2, то ждать приходится оооущень долга. :wacko:]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2499230</guid>
        <pubDate>Mon, 08 Feb 2010 12:53:31 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2499230</link>
        <description><![CDATA[Navi1982: Всем здрасти&#33; :writer: Я пропал, потому что в командировку уехал. Щас пишу от знакомого. Программированием щас нет возможности занятся. Скоро вернусь.  :hunter:]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2486010</guid>
        <pubDate>Tue, 26 Jan 2010 03:12:32 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2486010</link>
        <description><![CDATA[AndNot: <strong class='tag-b'>Navi1982</strong>, меня тоже когда то терзали такие сомнения. После множества тестов остановился на простом варианте: числа хранятся &quot;как есть&quot;, то есть в маш. представлении, но всегда беззнаковые: <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">struc LONG</div><div class="code_line">&nbsp;&nbsp;max &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dd ? &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; макс. количество ячеек (Cell)</div><div class="code_line">&nbsp;&nbsp;sign &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dd ? &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; знак числа</div><div class="code_line">&nbsp;&nbsp;dot &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dd ? &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; положение точки</div><div class="code_line">&nbsp;&nbsp;len &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dd ? &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; использовано ячеек</div><div class="code_line">&nbsp;&nbsp;; здесь начинается число</div><div class="code_line">ends</div></ol></div></div></div></div>Упрощенно говоря число хранится точно так же как и четыре байта в DWORD, только здесь размер ячеек 32-х битный. Знак числа и его длина вынесены в отдельные флаги по одной причине: реализация умножения, деления, извлечения корня и возведения в степень, для чисел без знака, на несколько порядков проще и быстрее реализации для чисел в доп. коде, не говоря уж о сложении, вычитании и командах сравнения чисел. Значительно проще. Например умножение будет выглядеть так: <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">; esi - умножаемое</div><div class="code_line">; edi - множитель</div><div class="code_line">; ebx - результат</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@cycle:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;xor &nbsp; &nbsp; ebp, ebp ; ebx - index, для проходов по массивам</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@loop:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov &nbsp; &nbsp; eax, [esi+ebp*4]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mul &nbsp; &nbsp; [dword edi]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;add &nbsp; &nbsp; [ebx+ebp*4], eax ; inc(dst[index], eax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;adc &nbsp; &nbsp; [ebx+ebp*4+4], edx ; adc(dst[index+1], edx)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;lea &nbsp; &nbsp; edx, [ebp*4+8] ; edx = index+2</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@carry:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jnc &nbsp; &nbsp; @@next</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;adc &nbsp; &nbsp; [dword ebx+edx], 0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;lea &nbsp; &nbsp; edx, [edx+4] &nbsp; &nbsp; &nbsp; ; edx = edx+4 &nbsp;/флаг переполнения изменять нельзя!/</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jmp &nbsp; &nbsp; @@carry</div><div class="code_line">&nbsp;&nbsp; &nbsp;@@next:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;add &nbsp; &nbsp; ebp, 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cmp &nbsp; &nbsp; ebp, [esi-4] ; if (ebp &#60; len) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jb &nbsp; &nbsp; &nbsp;@@loop ; повторяем</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;add &nbsp; &nbsp; edi, 4</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;add &nbsp; &nbsp; ebx, 4</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dec &nbsp; &nbsp; ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jnz &nbsp; &nbsp; @@cycle</div></ol></div></div></div></div>Коротко и ясно. А попробуй ка сделать эмуляцию знакового умножения - проще повеситься :)<br>
К сожалению код привести не могу, там все на интелектуальных макросах (т.е. генерируемый код зависит от операндов, типа как компиляторы ЯВУ оптимизируют).<br>
<br>
ps: кусок кода выдрал из макроса, так что не ручаюсь за его полную работоспособность.]]></description>
        <author>AndNot</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2485962</guid>
        <pubDate>Mon, 25 Jan 2010 21:32:39 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2485962</link>
        <description><![CDATA[Navi1982: хммм... долго думал... и не как не решил... а может это я все зря пишу? в смысле - дублирования функций: по модулю и со знаком... начал читать одну статейку (курсовую) про кодирование чисел <a class='tag-url' href='http://revolution.allbest.ru/programming/00084704_0.html' target='_blank'>см. главу &quot;Прямой, обратный и дополнительный коды&quot; и далее</a>.<br>
...и вдруг призадумался... может хранить числа и оперировать над ними так как это делается в процессорах??&#33;<br>
<br>
в этом есть несколько приимуществ:<ul class="tag-list"><li> избавляемся от заморочек со знаками заменяя на другие заморочки, а ля инвертирование числа при отрицательных знаках (наверное можно реализовать &quot;на лету&quot; в цыкле вычисления);</li><li> за-то, вычетание делается сложением, без предварительной проверки на Больше или Меньше, но тогда еще придется добавить алгоритм, который бы расширял разрядную сетку в случаях переполнения;</li><li> знак не придется хранить отдельным полем.</li></ul><br>
Или же оставить прямое кодирование так как оно уже есть?&#33;...<br>
<br>
P.S.&gt; Интересно ваше мнение... А то у меня почему-то возникают сомнения в выйгрыше по скорости, используя машинный способ кодирования числа...]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2478428</guid>
        <pubDate>Mon, 18 Jan 2010 19:54:46 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2478428</link>
        <description><![CDATA[sCreator: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2474395'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2010-01-14T21:10:47+00:00">14.01.10, 21:10</time></span><div class='quote '>Ха-ха  :D значит мы заметили это одновременно&#33;  :lol:</div></div><br>
Может и одновременно, только <strong class='tag-b'>&quot;это&quot;</strong> у нас разное. :jokingly:]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2478184</guid>
        <pubDate>Mon, 18 Jan 2010 15:16:18 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2478184</link>
        <description><![CDATA[Navi1982: Ну, вот... Дождался ответа <strong class='tag-b'>BugHunter</strong>&#39;а и он мне напомнил, что в его функции значение &quot;0&quot; задается <em class='tag-i'>.data=<strong class='tag-b'>nil</strong></em> и <em class='tag-i'>.flag=0</em>. И я принял решение подправить его функцию таким вот образом (см. в конце):<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">//Создана BugHunter&#39;ом по мотивам sCreator&#39;а</div><div class="code_line">{Функция преобразования форматированой строки-10сс в массив-2^32сс}</div><div class="code_line">{ Функция ожидает строку, содержащую корректную запись целого числа, &nbsp;}</div><div class="code_line">{ форматированую в соответствии со спецификацией: строка должна &nbsp; &nbsp; &nbsp; }</div><div class="code_line">{ содержать только цифры и возможно знак &#39;+&#39;, &#39;-&#39; или один лидирующий }</div><div class="code_line">{ пробел вместо знака &#39;+&#39;. Для входящей строки, не соответствующей &nbsp; &nbsp;}</div><div class="code_line">{ спецификации, результат работы функции непредсказуем. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">Function StrToHugeInt(const s: string): THugeInt;</div><div class="code_line">&nbsp;&nbsp;Var</div><div class="code_line">&nbsp;&nbsp; &nbsp;i, rdlen, j, toend, k: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;a: int64;</div><div class="code_line">&nbsp;&nbsp; &nbsp;alw: array[0..1] of longword absolute a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;aa, inmind: longword;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.data:=nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.flag:=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (s[1] in [&#39;+&#39;,&#39;-&#39;,&#39; &#39;]) then i:=2 else i:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;toend:=length(s)-i+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;rdlen:=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (toend&#62;0) do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{йцукен фыва ячсми}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (toend&#62;=9) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;aa:=1000000000;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;k:=9;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;aa:=10; for k:=2 to toend do aa:=aa*10;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;k:=toend;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{умножаем result.data на aa}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inmind:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for j:=0 to rdlen-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a:=int64(result.data[j])*aa+inmind;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;result.data[j]:=alw[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;inmind:=alw[1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (inmind&#62;0) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;setlength(result.data, rdlen+1); inc(rdlen);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;result.data[rdlen-1]:=inmind;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{йцукен фыва ячсми}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;aa:=strtoint(copy(s, i, k));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{складываем result.data и aa}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inmind:=aa;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for j:=0 to rdlen-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a:=int64(result.data[j])+inmind;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;result.data[j]:=alw[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;inmind:=alw[1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (inmind=0) then break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (inmind&#62;0) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;setlength(result.data, rdlen+1); inc(rdlen);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;result.data[rdlen-1]:=inmind;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{йцукен фыва ячсми}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc(i, k); dec(toend, k);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (toend=0) then break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (s[1]=&#39;-&#39;) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.flag:=-rdlen</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.flag:=rdlen;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//я тут добавил для обработки нолей.</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (result.data=nil)and(result.flag=0) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; SetLength(result.data,1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; result.data[0]:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; result.flag:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
<strong class='tag-b'>sCreator</strong>, я таким образом решил и вопрос со сравнением -0 и +0]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2474684</guid>
        <pubDate>Fri, 15 Jan 2010 08:44:30 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2474684</link>
        <description><![CDATA[sCreator: Если бы еще знать на каком варианте функции StrToHugeInt Вы остановились - а то у меня их штук 5]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2474395</guid>
        <pubDate>Thu, 14 Jan 2010 21:10:47 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2474395</link>
        <description><![CDATA[Navi1982: Ха-ха  :D значит мы заметили это одновременно&#33;  :lol: <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2010-01-14T21:45:06+00:00">14.01.10, 21:45</time></span></span><br>
А вот и <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2424169' target='_blank'>ссылка</a> той самой функции StrToHugeInt.]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2474394</guid>
        <pubDate>Thu, 14 Jan 2010 21:06:42 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2474394</link>
        <description><![CDATA[sCreator: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2474387'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2010-01-14T20:59:32+00:00">14.01.10, 20:59</time></span><div class='quote '>На счет нулевого значения... хммм... - получается, что число может иметь как &quot;-0&quot;, так и &quot;+0&quot;... а это может как-то критично обернутся в будущем?&#33; А что предлагаете вы? </div></div><br>
Пока ничего не предлагаю кроме как подумать над этим и подставить в функции сравнения -0 и +0 <br>
они не выдадут что нули равны - надо это как то учесть]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2474387</guid>
        <pubDate>Thu, 14 Jan 2010 20:59:32 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2474387</link>
        <description><![CDATA[Navi1982: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>sCreator</span><div class='quote '>Последние две строки правильно работают на отрицательных числах ?</div></div><br>
<strong class='tag-b'>sCreator</strong>, спасибо - вы правы, как всегда&#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">...</div><div class="code_line">if i&#60;0 then r:=0 else</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.data[i]&#62;op2.data[i] then r:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.data[i]&#60;op2.data[i] then r:=-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.flag&#60;0 then r:=r*-1; //&#60;= вот эта строчка: спасибо sCreator&#39;у что заметил!</div><div class="code_line">...</div></ol></div></div></div></div><br>
<em class='tag-i'>исправлений выше делать не буду, поскольку хочу скоро открыть новую тему, где будут выкладыватся комплексные решения, но сдесь хочу продолжить обсуждать <span class='tag-u'>этот</span> модуль.</em><br>
<br>
На счет нулевого значения... хммм... - получается, что число может иметь как &quot;-0&quot;, так и &quot;+0&quot;... а это может как-то критично обернутся в будущем?&#33; А что предлагаете вы? <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2010-01-14T21:03:25+00:00">14.01.10, 21:03</time></span></span><br>
Кстати, ваше замечание меня навело на мысль и эта мысль помогла мне обнаружить, что у меня возникают проблемы при обработке нолей&#33; :( Еще точнее - это происходит в функции StrToHugeInt.]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2474011</guid>
        <pubDate>Thu, 14 Jan 2010 15:55:53 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2474011</link>
        <description><![CDATA[sCreator: <strong class='tag-b'>leo</strong> прошелся по асму, пройдусь по другому<br>
<strong class='tag-b'>Navi1982</strong><br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>- вот истинное удобство поля .flag &#33; :D</div></div><br>
и где?<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">{функция сравнения с учетом знака}</div><div class="code_line">{возвращает: 1 if op1&#62;op2; 0 if op1=op2; -1 if op1&#60;op2}</div><div class="code_line">{!!!доработать если операнды=nil}</div><div class="code_line">Function HICompare(Const op1, op2:THugeInt):integer;</div><div class="code_line">Var i,r:integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp;if op1.flag&#62;op2.flag then r:=1;</div><div class="code_line">&nbsp;&nbsp;if op1.flag&#60;op2.flag then r:=-1;</div><div class="code_line">&nbsp;&nbsp;if op1.flag=op2.flag then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;i:=abs(op1.flag)-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (i&#62;=0)and(op1.data[i]=op2.data[i]) do Dec(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if i&#60;0 then r:=0 else</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.data[i]&#62;op2.data[i] then r:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.data[i]&#60;op2.data[i] then r:=-1;</div></ol></div></div></div></div><br>
Последние две строки правильно работают на отрицательных числах ?<br>
<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">{Функция сложения по модулю}</div><div class="code_line">Function HIModAdd(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,len,lenmax:integer;</div><div class="code_line">&nbsp;&nbsp;t:Int64;</div><div class="code_line">&nbsp;&nbsp;cr:array [0..1] of cardinal absolute t;</div><div class="code_line">&nbsp;&nbsp;pMax: THugeInt;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;//возьмем число за основу</div><div class="code_line">&nbsp;&nbsp;if abs(op1.flag)&#60;abs(op2.flag) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;len:=abs(op1.flag); lenmax:=abs(op2.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp;pMax.data := op2.data;</div><div class="code_line">&nbsp;&nbsp;end else //abs(op1.flag)&#62;=abs(op2.flag)</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;len:=abs(op2.flag); lenmax:=abs(op1.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp;pMax.data := op1.data;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(result.data,lenmax); //определим размер результата</div><div class="code_line">&nbsp;&nbsp; &nbsp;//начинаем сложение с младших элементов до минимальной длины</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:=0; //&#60;=&#62; cr[0..1]:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=0 to len-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op1.data[i])+int64(op2.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//далее прибавляем 0 с переносами до конца</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=len to lenmax-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(pMax.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;//учтем значение последнего переноса</div><div class="code_line">&nbsp;&nbsp;if cr[1] &#62; 0 then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;lenmax:=lenmax+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(result.data,lenmax);</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.data[lenmax-1]:=cr[1];</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;result.flag:=lenmax; //длина результата</div><div class="code_line">end;</div></ol></div></div></div></div><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">Procedure HICorrection(Var op:THugeInt);</div></ol></div></div></div></div><br>
Т.е. нулевое число у Вас может иметь два представления: или <strong class='tag-b'>(op.flag=-1;op.data=(0))</strong> или <strong class='tag-b'>(op.flag=1;op.data=(0))</strong> ?<br>
<br>
немного отредактировал одну цитату ( нету взял ) и хотел добавить про <br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>- вот истинное удобство поля .flag &#33; :D</div></div><br>
где же оно<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">Function HICompare(Const op1, op2:THugeInt):integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp;Result := IfThen(op1.znak, -1, 1);</div><div class="code_line">&nbsp;&nbsp;if not (op1.znak xor op2.znak) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := Result * HIModCompare(op1, op2);</div><div class="code_line">End;</div></ol></div></div></div></div><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">function HIModCompare(const op1, op2: THugeInt): integer;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := CompareValue(length(op1.data), length(op1.data));</div><div class="code_line">&nbsp;&nbsp;if Result = 0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;i := length(op1.data) - 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (i &#62;= 0) and (op1.data[i] = op2.data[i]) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Dec(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if i &#60; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := CompareValue((op1.data[i], op2.data[i]));</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2471992</guid>
        <pubDate>Wed, 13 Jan 2010 09:03:45 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2471992</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2471688'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2010-01-12T22:23:13+00:00">12.01.10, 22:23</time></span><div class='quote '><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">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ESI,op1.data //&#60;- то ESI принимает значение 1</div></ol></div></div></div></div><br>
Способ исправления - либо используем P2, либо op1 должен быть Var&#33; А может и как-то иначе можно разрешить вопрос?&#33; </div></div><br>
Ах, да - ведь op1 передается как const, т.е. по указателю, а не по значению, поэтому непосредственно мувить op1.data нельзя (только странно почему дельфи это проглатывает и вместо ошибки выдает фиг знает что)<br>
Варианты решения: либо просто передавать op1 по значению (убрать const из объявления параметров), либо оставить const и слегка изменить асм-код:<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">&nbsp;&nbsp;mov esi,op1 &nbsp;//загружаем в esi указатель на op1</div><div class="code_line">&nbsp;&nbsp;mov esi,[esi+THugeInt.data] //загружаем в esi указатель на op1.data</div></ol></div></div></div></div><br>
При const можно также и промежуточный P2 использовать, но только не копировать весь массив через Copy, а просто присвоить ссылку на data:<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">&nbsp;&nbsp;P2.data:=op1.data;</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;...</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov esi,P2.data</div><div class="code_line">&nbsp;&nbsp; &nbsp;...</div></ol></div></div></div></div><br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2471688'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2010-01-12T22:23:13+00:00">12.01.10, 22:23</time></span><div class='quote '>MOV     EDI,P2.data[0]</div></div><br>
Здесь никакие [0] не нужны, т.к. в асме квадратные скобки имеют совсем другой смысл. В данном случае запись P2.data[0] является эквивалентом pChar(P2.data)+0, т.е. это тоже самое что и просто P2.data, но более туманно и двусмысленно]]></description>
        <author>leo</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2471688</guid>
        <pubDate>Tue, 12 Jan 2010 22:23:13 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2471688</link>
        <description><![CDATA[Navi1982: Вот&#33; Зацените...<br>
<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">type</div><div class="code_line">&nbsp;&nbsp;THugeInt = record //&quot;HugeInt&quot; &#60;=&#62; &quot;HI&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;flag: longint;</div><div class="code_line">&nbsp;&nbsp; &nbsp;data: array of longword;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div></ol></div></div></div></div>...<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">{Процедура коррекции числа:</div><div class="code_line">&nbsp;убирает незначемые нулевые элементы с конца .data}</div><div class="code_line">Procedure HICorrection(Var op:THugeInt);</div><div class="code_line">Var i,sg:integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;if op.data &#60;&#62; nil then //or op.flag&#60;&#62;0</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; if op.flag&#60;0 then sg:=-1 else sg:=1;</div><div class="code_line">&nbsp;&nbsp; i:=length(op.data)-1;</div><div class="code_line">&nbsp;&nbsp; while (i&#62;0)and(op.data[i]=0) do Dec(i); //пока не первый и равен нулю</div><div class="code_line">&nbsp;&nbsp; SetLength(op.data,i+1);</div><div class="code_line">&nbsp;&nbsp; op.flag:=length(op.data)*sg;</div><div class="code_line">&nbsp;end;</div><div class="code_line">End;</div></ol></div></div></div></div><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">{функция сравнения по модулю, нужна для некоторых операций}</div><div class="code_line">{возвращает: 1 if |op1|&#62;|op2|; 0 if |op1|=|op2|; -1 if |op1|&#60;|op2|}</div><div class="code_line">{!!!доработать если операнды=nil}</div><div class="code_line">Function HIModCompare(Const op1, op2:THugeInt):integer;</div><div class="code_line">Var i,r:integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp;if abs(op1.flag)&#62;abs(op2.flag) then r:=1;</div><div class="code_line">&nbsp;&nbsp;if abs(op1.flag)&#60;abs(op2.flag) then r:=-1;</div><div class="code_line">&nbsp;&nbsp;if abs(op1.flag)=abs(op2.flag) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;i:=abs(op1.flag)-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (i&#62;=0)and(op1.data[i]=op2.data[i]) do Dec(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if i&#60;0 then r:=0 else</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.data[i]&#62;op2.data[i] then r:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.data[i]&#60;op2.data[i] then r:=-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">result:=r;</div><div class="code_line">End;</div></ol></div></div></div></div><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">{функция сравнения с учетом знака}</div><div class="code_line">{возвращает: 1 if op1&#62;op2; 0 if op1=op2; -1 if op1&#60;op2}</div><div class="code_line">{!!!доработать если операнды=nil}</div><div class="code_line">Function HICompare(Const op1, op2:THugeInt):integer;</div><div class="code_line">Var i,r:integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp;if op1.flag&#62;op2.flag then r:=1;</div><div class="code_line">&nbsp;&nbsp;if op1.flag&#60;op2.flag then r:=-1;</div><div class="code_line">&nbsp;&nbsp;if op1.flag=op2.flag then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;i:=abs(op1.flag)-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (i&#62;=0)and(op1.data[i]=op2.data[i]) do Dec(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if i&#60;0 then r:=0 else</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.data[i]&#62;op2.data[i] then r:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if op1.data[i]&#60;op2.data[i] then r:=-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">result:=r;</div><div class="code_line">End;</div></ol></div></div></div></div> - вот истинное удобство поля .flag &#33; :D<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">{Функция сложения по модулю}</div><div class="code_line">Function HIModAdd(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,len,lenmax:integer;</div><div class="code_line">&nbsp;&nbsp;t:Int64;</div><div class="code_line">&nbsp;&nbsp;cr:array [0..1] of cardinal absolute t;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;//возьмем число за основу</div><div class="code_line">&nbsp;&nbsp;if abs(op1.flag)&#60;abs(op2.flag) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;len:=abs(op1.flag); lenmax:=abs(op2.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(result.data,lenmax); //определим размер результата</div><div class="code_line">&nbsp;&nbsp; &nbsp;//начинаем сложение с младших элементов до минимальной длины</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:=0; //&#60;=&#62; cr[0..1]:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=0 to len-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op1.data[i])+int64(op2.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//далее прибавляем 0 с переносами до конца</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=len to lenmax-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op2.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end else //abs(op1.flag)&#62;=abs(op2.flag)</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;len:=abs(op2.flag); lenmax:=abs(op1.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(result.data,lenmax); //определим размер результата</div><div class="code_line">&nbsp;&nbsp; &nbsp;//начинаем сложение с младших элементов до минимальной длины</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:=0; //&#60;=&#62; cr[0..1]:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=0 to len-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op1.data[i])+int64(op2.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//далее прибавляем 0 с переносами до конца</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=len to lenmax-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op1.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;//учтем значение последнего переноса</div><div class="code_line">&nbsp;&nbsp;if t&#62;$FFFFFFFF then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;lenmax:=lenmax+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(result.data,lenmax);</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.data[lenmax-1]:=cr[1];</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;result.flag:=lenmax; //длина результата</div><div class="code_line">end;</div></ol></div></div></div></div><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">{Функция вычетания по модулю}</div><div class="code_line">{result = op1 - op2; only if |op1| &#62;= |op2|}</div><div class="code_line">Function HIModSub(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,len,rif:integer;</div><div class="code_line">&nbsp;&nbsp;P1,P2:THugeInt;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;result.data:=nil;</div><div class="code_line">&nbsp;&nbsp;result.flag:=0;</div><div class="code_line">&nbsp;&nbsp;//проверка, если |op1| &#62;= |op2|</div><div class="code_line">&nbsp;&nbsp;rif:=HIModCompare(op1,op2);</div><div class="code_line">&nbsp;&nbsp;if rif&#62;=0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; len:=length(op1.data);</div><div class="code_line">&nbsp;&nbsp; P1.data:=Copy(op1.data);</div><div class="code_line">&nbsp;&nbsp; SetLength(P1.data,len); P1.flag:=len;</div><div class="code_line">&nbsp;&nbsp; P2.data:=Copy(op2.data);</div><div class="code_line">&nbsp;&nbsp; SetLength(P2.data,len); P2.flag:=len;</div><div class="code_line">//начинаем вычитане</div><div class="code_line">asm</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EAX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDI,P2.data[0]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ESI,P1.data</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ECX,len</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLC</div><div class="code_line">@@1: &nbsp; &nbsp;LODSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SBB &nbsp; &nbsp; EAX,[EDI]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;STOSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LOOP &nbsp; &nbsp;@@1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EAX</div><div class="code_line">end;</div><div class="code_line">HICorrection(P2);</div><div class="code_line">result.data:=Copy(P2.data);</div><div class="code_line">result.flag:=P2.flag;</div><div class="code_line">end;</div><div class="code_line">end;</div></ol></div></div></div></div> - Кстати, переделал слегка. Однако, есть трабла... Когда делаю так (см. коментарии в ASM блоке):<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">{Функция вычетания по модулю}</div><div class="code_line">{result = op1 - op2; only if |op1| &#62;= |op2|}</div><div class="code_line">Function HIModSub(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,len,rif:integer;</div><div class="code_line">&nbsp;&nbsp;P2:THugeInt;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;result.data:=nil;</div><div class="code_line">&nbsp;&nbsp;result.flag:=0;</div><div class="code_line">&nbsp;&nbsp;//проверка, если |op1| &#62;= |op2|</div><div class="code_line">&nbsp;&nbsp;rif:=HIModCompare(op1,op2);</div><div class="code_line">&nbsp;&nbsp;if rif&#62;=0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; len:=length(op1.data);</div><div class="code_line">&nbsp;&nbsp; P2.data:=Copy(op2.data);</div><div class="code_line">&nbsp;&nbsp; SetLength(P2.data,len); P2.flag:=len;</div><div class="code_line">//начинаем вычитане</div><div class="code_line">asm</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EAX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDI,P2.data[0]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ESI,op1.data //&#60;- то ESI принимает значение 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ECX,len</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLC</div><div class="code_line">@@1: &nbsp; &nbsp;LODSD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//&#60;- в результате происходит ошибка чтения</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SBB &nbsp; &nbsp; EAX,[EDI]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;STOSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LOOP &nbsp; &nbsp;@@1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EAX</div><div class="code_line">end;</div><div class="code_line">HICorrection(P2);</div><div class="code_line">result.data:=Copy(P2.data);</div><div class="code_line">result.flag:=P2.flag;</div><div class="code_line">end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
Способ исправления - либо используем P2, либо op1 должен быть Var&#33; А может и как-то иначе можно разрешить вопрос?&#33;]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2471372</guid>
        <pubDate>Tue, 12 Jan 2010 17:12:46 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2471372</link>
        <description><![CDATA[sCreator: <strong class='tag-b'>Navi1982</strong><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2471317'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2010-01-12T16:39:04+00:00">12.01.10, 16:39</time></span><div class='quote '>На счет документации дельфи про SetLength - проверял опытным путем, под наблюдением Watches... Хотя, кто знает как оно себя поведет потом... Возможно уже так себя и ведет.<br>
</div></div><br>
Прочитайте внимательно посты <strong class='tag-b'>leo </strong>и мои - уже разобрались - новые элементы зануляются ( проверено в 7 и 2010 ). <br>
Procedure HICorrection(op:THugeInt); не выполняет условие нуля ( data=nil, flag=0 )<br>
<br>
и какая у Вас теперь функция ( смотрите замечания <strong class='tag-b'>leo </strong> по асму своей ) ? ( а лучше возьмите его, если не нужны мои дополнения )]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2471363</guid>
        <pubDate>Tue, 12 Jan 2010 17:07:14 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2471363</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2471317'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2010-01-12T16:39:04+00:00">12.01.10, 16:39</time></span><div class='quote '>я не игнорирую рекомендации sCreator&#39;a задавать длину после Copy, но просто в моих случаях там гарантированно не выходит за пределы</div></div><br>
За какие пределы ? Твои слова:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2471317'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2010-01-12T16:39:04+00:00">12.01.10, 16:39</time></span><div class='quote '>Вот какие числа складываются: 99999999999999999999 - 200 </div></div><br>
т.е. длина первого числа = 3, а второго = 1, и соотв-но при P2.data:=Copy(op2.data) длина массива P2 становится равной 1, а не 3, и соотв-но в старших 2-х элементах содержится какой-то случайный мусор и поэтому <br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2471317'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2010-01-12T16:39:04+00:00">12.01.10, 16:39</time></span><div class='quote '>Результат выдает правильно только в первом элементе (4 байта) а во втором происходит отрицание и даже с вариацией... Но такой результат не всегда происходит - иногда правильно показывает результат, а иногда нет... </div></div><br>
т.е. &quot;искажение&quot; происходит не при HICorrection, а раньше - при вычитании, т.к. массивы P1 и P2 имеют разную длину]]></description>
        <author>leo</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2471317</guid>
        <pubDate>Tue, 12 Jan 2010 16:39:04 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2471317</link>
        <description><![CDATA[Navi1982: Да, я согласен с тем что моя функция не претендует на идеал, но если я не ошибаюсь, то делал замечание на то, что сначала пробовал именно как подсказал <strong class='tag-b'>leo</strong>, а потом даже перераспределил переменные с тем, чтобы убедится что нет ошибки... А вопрос ошибки так и не решился... Т.е. я все про ту же передачу данных массива... При возвращении из процедуры <em class='tag-i'>HICorrection</em> данные искажаются&#33; Причем, не всегда&#33;&#33;&#33; Я пробовал и со словом <strong class='tag-b'>VAR </strong>(что по ходу воспринимается по умолчанию) Кароче тупизм какой-то... попробывал предложение <strong class='tag-b'>leo</strong>, коректировать прямо в функции <em class='tag-i'>HIModSub</em> - та же ерунда... Результат выдает правильно только в первом элементе (4 байта) а во втором происходит отрицание и даже с вариацией... Но такой результат не всегда происходит - иногда правильно показывает результат, а иногда нет... Я просто в шоке&#33;<br>
Вот какие числа складываются: 99999999999999999999 - 200 = правильно / и неправильно с отклонениями через 1-2 раза. Череда между правильно и неправильно тоже вариирует, но только после функции <em class='tag-i'>HIModAdd</em> (см.выше по теме).<br>
<br>
<strong class='tag-b'>leo</strong>, я не игнорирую рекомендации <strong class='tag-b'>sCreator</strong>&#39;a задавать длину после <em class='tag-i'>Copy</em>, но просто в моих случаях там гарантированно не выходит за пределы.<br>
<br>
<strong class='tag-b'>sCreator</strong>, не 200-300, а на оборот 300-200... Такие числа гарантирую покамись я.<br>
На счет документации дельфи про <em class='tag-i'>SetLength </em>- проверял опытным путем, под наблюдением <span class='tag-u'>Watches</span>... Хотя, кто знает как оно себя поведет потом... Возможно уже так себя и ведет.<br>
<br>
Вобщем бьюсь и пробую пока ваши варианты... <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2010-01-12T16:49:39+00:00">12.01.10, 16:49</time></span></span><br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>sCreator</span><div class='quote '>И так и не понял формат нуля:<br>
- он data=nil, flag=0<br>
- или data=(0), flag=1 ?<br>
</div></div><br>
<br>
первое.]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470622</guid>
        <pubDate>Tue, 12 Jan 2010 10:17:58 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470622</link>
        <description><![CDATA[sCreator: Согласен.<br>
Про <strong class='tag-b'>system.DynArraySetLength</strong> взял на заметку ( вот так и верь справке ) и проверил - в 2010 тоже самое.]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470600</guid>
        <pubDate>Tue, 12 Jan 2010 09:55:28 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470600</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2470535'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>sCreator &#064; <time class="tag-quote__quoted-time" datetime="2010-01-12T08:53:41+00:00">12.01.10, 08:53</time></span><div class='quote '>Можно еще сэкономить на P если использовать вместо него op2 (сперва увеличить длинну потом восстановить )</div></div><br>
Тогда придется передавать op2 как var-параметр, да и суть экономии не очень понятна, т.к. во-первых, в любом сл.нужно выделять новый массив под result и соотв-но изменение длины op2 приведет к лишнему расходу памяти, во-вторых, увеличение длины массива op2 без его перелокации по новому адресу не гарантировано, а перелокация влечет за собой копирование старых данных на новое место и следовательно выигрыша по скорости тоже не будет - поэтому лучше и проще сразу скопировать op2 в result (= P)<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2470535'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>sCreator &#064; <time class="tag-quote__quoted-time" datetime="2010-01-12T08:53:41+00:00">12.01.10, 08:53</time></span><div class='quote '>Если SetLength() увеличивает длинну массива то согласно справки Delphi новые элементы имеют неопределенное значения ( т.е. не обязательно = 0 )</div></div><br>
Согласно справке - да, а согласно исходнику system.DynArraySetLength в дельфи 7 новые элементы зануляются независимо от их типа<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">&nbsp;&nbsp;// Set the new memory to all zero bits</div><div class="code_line">&nbsp;&nbsp;FillChar((PChar(p) + elSize * oldLength)^, elSize * (newLength - oldLength), 0);</div></ol></div></div></div></div><br>
и маловероятно, что это поведение было&#092;будет изменено в последующих версиях <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2010-01-12T10:00:01+00:00">12.01.10, 10:00</time></span></span><br>
PS: В моем &quot;как-то так&quot; варианте для копирования op2 в P вместо Copy + SetLength видимо лучше юзать<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">SetLength(P,len);</div><div class="code_line">Move(op2.data[0],P.data[0],length(op2)*SizeOf(integer));</div></ol></div></div></div></div>]]></description>
        <author>leo</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470535</guid>
        <pubDate>Tue, 12 Jan 2010 08:53:41 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470535</link>
        <description><![CDATA[sCreator: Можно еще сэкономить на P если использовать вместо него op2 (сперва увеличить длинну потом восстановить )<br>
И хочу обратить внимание <strong class='tag-b'>Navi1982</strong> что <strong class='tag-b'>leo</strong> сказал &quot;как-то так:&quot; - он показывает Вам принцип, костяк, который надо отработать.<br>
В часности <br>
- вопрос с вычитанием 200 - 300 не решен функция выдаст FFFFFF9C = 4294967196 ( т.е. дополнительный вид числа )<br>
- Если SetLength() увеличивает длинну массива то согласно справки Delphi новые элементы имеют неопределенное значения ( т.е. не обязательно = 0 )<br>
<br>
И так и не понял формат нуля:<br>
- он  data=nil, flag=0<br>
- или data=(0), flag=1 ?<br>
<br>
Я когда выдирал function HIModMinus(const op1, op2: THugeInt): THugeInt;<br>
из выложенных ранее классовых методов не включил в нее работу со знаками и полную обработку если op1 меньше, потому, что так и не понял, какое у Вас теперь представление знака и у меня там это решалось комплексно в методах<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">&nbsp;&nbsp; &nbsp;function plus(const Val: IBigInt):IBigInt; overload;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function plus(const Val: TElemTyp):IBigInt; overload;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function minus(const Val: IBigInt):IBigInt; overload;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function minus(const Val: TElemTyp):IBigInt; overload;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// складывает не смотря на знаки</div><div class="code_line">&nbsp;&nbsp; &nbsp;function ModPlus(const Val: IBigInt):IBigInt; overload;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function ModPlus(const Val: TElemTyp):IBigInt; overload; // надеюсь немного быстрее</div><div class="code_line">&nbsp;&nbsp; &nbsp;// вычитает не смотря на знаки</div><div class="code_line">&nbsp;&nbsp; &nbsp;function ModMinus(const Val: IBigInt):IBigInt; overload;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function ModMinus(const Val: TElemTyp):IBigInt; overload;</div></ol></div></div></div></div><br>
Экономия у меня не только в памяти но и в том, что я сперва вычитаю массивы на длинну меньшего, а вовтором асме просто учитывается знак переполнения.<br>
Т.е. при вычитании из числа размерностью в 100000 элементов числа размерностью 100 эл. у меня в лучшем случае дело ограничится циклом до 100]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470438</guid>
        <pubDate>Tue, 12 Jan 2010 07:02:12 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470438</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2470308'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2010-01-11T22:37:09+00:00">11.01.10, 22:37</time></span><div class='quote '>Тогда как правильно получить массив?</div></div><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">Procedure HICorrection(var op:THugeInt); //!!! VAR</div></ol></div></div></div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2470187'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2010-01-11T20:14:21+00:00">11.01.10, 20:14</time></span><div class='quote '>и код вышел проще чем у sCreator&#39;а... Хотя у sCreator&#39;а есть приемущество - экономичный расход памяти</div></div><br>
Преимущество не только в расходе памяти, но и в быстродействии, т.к. нет ненужных копирований массивов. А твой вариант - это просто чудо &quot;антиоптимизации&quot; ;) Вопросы на засыпку: <br>
1) зачем создавать полную копию массива op1, если можно читать данные непосредственно из op1 ? <br>
2) зачем для result создавать отдельную копию массива P1, если можно выдать сам массив P1.data ?<br>
3) зачем в цикле юзать юзать совершенно ненужные дополнительные операции записи и чтения [EDI]:  <br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2470308'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2010-01-11T22:37:09+00:00">11.01.10, 22:37</time></span><div class='quote '><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">&nbsp;&nbsp;SBB &nbsp; &nbsp; [EDI],EAX</div><div class="code_line">&nbsp;&nbsp;MOV &nbsp; &nbsp; EAX,[EDI]</div></ol></div></div></div></div></div></div><br>
если можно просто поменять массивы местами или вобще отказаться от LODS&#092;STOS ?<br>
К тому же ты упорно игнорируешь замечание <strong class='tag-b'>sCreator</strong>&#39;а о том, что длину массива нужно задавать не перед Copy, а после, т.к. Copy изменяет длину массива.<br>
С учетом сказанного, если уж использовать выравнивание длин массивов для упрощения вычитания, то как-то так:<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">{Функция вычетания: result = op1 - op2; only if |op1| &#62;= |op2|}</div><div class="code_line">function HIModSub(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;len,i:integer;</div><div class="code_line">&nbsp;&nbsp;P:THugeInt;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result.data:=nil;</div><div class="code_line">&nbsp;&nbsp;Result.flag:=0;</div><div class="code_line">&nbsp;&nbsp;//проверка, если op1 больше или ровно op2!</div><div class="code_line">&nbsp;&nbsp;len:=length(op1.data);</div><div class="code_line">&nbsp;&nbsp;if (len = 0) or (len &#60; length(op2.data)) then Exit;</div><div class="code_line">&nbsp;&nbsp;P.data:=Copy(op2.data); &nbsp;</div><div class="code_line">&nbsp;&nbsp;SetLength(P.data,len);</div><div class="code_line">&nbsp;&nbsp;//вычитане</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;push esi</div><div class="code_line">&nbsp;&nbsp; &nbsp;push edi</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov esi,op1.data</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov edi,P.data</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ecx,len</div><div class="code_line">&nbsp;&nbsp; &nbsp;test ecx,ecx //очистка CF вместо CLD</div><div class="code_line">@@1:</div><div class="code_line">&nbsp;&nbsp; &nbsp;lodsd</div><div class="code_line">&nbsp;&nbsp; &nbsp;sbb eax,[edi]</div><div class="code_line">&nbsp;&nbsp; &nbsp;stosd</div><div class="code_line">&nbsp;&nbsp; &nbsp;dec ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp;jnz @@1</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop edi</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop esi</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;//HiCorrection</div><div class="code_line">&nbsp;&nbsp;for i:=len-1 downto 0 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;if P.data[i] &#60;&#62; 0 then Break;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dec(len);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;if len &#60; length(P.data) then SetLength(P.data,len);</div><div class="code_line">&nbsp;&nbsp;result.data:=P.data;</div><div class="code_line">&nbsp;&nbsp;result.flag:=len;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>leo</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470308</guid>
        <pubDate>Mon, 11 Jan 2010 22:37:09 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470308</link>
        <description><![CDATA[Navi1982: А почему после процедуры коррекции в P1 меняются данные? (см. функцию HIModSub в конце) Такое ощущение, буд-то меняются ссылки на этот массив... или остаются старыми? Тогда как правильно получить массив?<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">{Процедура коррекции числа:</div><div class="code_line">&nbsp;убирает незначемые нулевые элементы с конца .data}</div><div class="code_line">Procedure HICorrection(op:THugeInt);</div><div class="code_line">Var i,sg:integer;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;if op.flag&#60;0 then sg:=-1 else sg:=1;</div><div class="code_line">&nbsp;i:=length(op.data)-1;</div><div class="code_line">&nbsp;while (i&#62;0)and(op.data[i]=0) do Dec(i); //пока не первый и равен нулю</div><div class="code_line">&nbsp;SetLength(op.data,i+1);</div><div class="code_line">&nbsp;op.flag:=length(op.data)*sg;</div><div class="code_line">End;</div></ol></div></div></div></div><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">{Функция вычетания: result = op1 - op2; only if |op1| &#62;= |op2|}</div><div class="code_line">Function HIModSub(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,len:integer;</div><div class="code_line">&nbsp;&nbsp;P1,P2:THugeInt;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;//проверка, если op1 больше или ровно op2!</div><div class="code_line">&nbsp;&nbsp;len:=length(op1.data);</div><div class="code_line">&nbsp;&nbsp;if len&#62;=length(op2.data) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; SetLength(P1.data,len); P1.flag:=len;</div><div class="code_line">&nbsp;&nbsp; P1.data:=Copy(op1.data);</div><div class="code_line">&nbsp;&nbsp; SetLength(P2.data,len); P2.flag:=len;</div><div class="code_line">&nbsp;&nbsp; P2.data:=Copy(op2.data);</div><div class="code_line">//начинаем вычитане</div><div class="code_line">asm</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EAX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDI,P1.data[0]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ESI,P2.data[0]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ECX,len</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLC</div><div class="code_line">@@1: &nbsp; &nbsp;LODSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SBB &nbsp; &nbsp; [EDI],EAX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EAX,[EDI]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;STOSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LOOP &nbsp; &nbsp;@@1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EAX</div><div class="code_line">end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">HiCorrection(P1);</div><div class="code_line">result.data:=Copy(P1.data);</div><div class="code_line">result.flag:=P1.flag;</div><div class="code_line">P1.data:=nil;</div><div class="code_line">P2.data:=nil;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470187</guid>
        <pubDate>Mon, 11 Jan 2010 20:14:21 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470187</link>
        <description><![CDATA[Navi1982: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>от_себя</span><div class='quote '>Но и такой код тоже не канает  - взял из книжки (асм).</div></div><br>
<br>
нашел прокол... теперь работает.. и код вышел проще чем у sCreator&#39;а... Хотя у sCreator&#39;а есть приемущество - экономичный расход памяти, но я не въехал каким образом у него происходит вычетание...<br>
<br>
а вот и место ошибки (в конце функции):<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">result.data:=Copy(res.data);</div><div class="code_line">result.flag:=res.flag;</div></ol></div></div></div></div><br>
<br>
а надо было так:<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">result.data:=Copy(P1.data);</div><div class="code_line">result.flag:=P1.flag;</div></ol></div></div></div></div><br>
<br>
всем спасибо за помощь&#33;&#33;&#33; :)<br>
<br>
P.S.: Перехожу на корректировку знаков и скоро выложу код.]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470182</guid>
        <pubDate>Mon, 11 Jan 2010 20:11:09 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470182</link>
        <description><![CDATA[sCreator: Для отладки надо выставлять Range и Owerflow Checking.<br>Тогда при попытки выйти за пределы массива сразу будет ошибка.<br>После отладки их снимают, чтобы побыстрее работало]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470176</guid>
        <pubDate>Mon, 11 Jan 2010 20:02:38 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470176</link>
        <description><![CDATA[Navi1982: Ага, видел эту статейку... она в DRBK записана и взята с http://delphiworld.narod.ru/<br>
Но я позно ее заметил, да к тому-же там функция перевода, мне так кажется (еще не пробовал), не так оптимальна как выработанная в этой теме :)<br>
<br>
<strong class='tag-b'>sCreator</strong>, Range и Owerflow Checking не выставлены. А должны быть?]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470081</guid>
        <pubDate>Mon, 11 Jan 2010 18:10:25 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470081</link>
        <description><![CDATA[sCreator: <strong class='tag-b'>Navi1982</strong><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">P1.data := Copy(op1.data);</div></ol></div></div></div></div><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">length(P1.data) = length(op1.data)</div></ol></div></div></div></div><br>
Аналогично для P2 в результате вы вычитаете мусор памяти<br>
( у Вас Range checking	и Overflow checking у компилятора выставлены? ) <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2010-01-11T18:29:06+00:00">11.01.10, 18:29</time></span></span><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">function HIModMinus(const op1, op2: THugeInt): THugeInt;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;res: THugeInt;</div><div class="code_line">&nbsp;&nbsp;v: longword;</div><div class="code_line">&nbsp;&nbsp;len1, len2, i: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if HIModCompare(op1, op2) &#60; 1 then</div><div class="code_line">&nbsp;&nbsp;begin // при op1 &#60;= op2 возвращаем 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result.data := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result.flag := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Exit</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;len1 := length(op1.data);</div><div class="code_line">&nbsp;&nbsp;len2 := length(op2.data);</div><div class="code_line">&nbsp;&nbsp;SetLength(Result.data,len1);</div><div class="code_line">&nbsp;&nbsp;v := SubMem(op1.data[0], op2.data[0], Result.data[0], len2);</div><div class="code_line">&nbsp;&nbsp;if len1 &#62; len2 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;v := SubMemDWord(op1.data[len2], v, Result.data[len2], len1 - len2);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if v &#60;&#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;raise Exception.Create(&#39;illegal param in HIModMinus(const op1, op2: THugeInt)&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;i := len1 - 1;</div><div class="code_line">&nbsp;&nbsp;while (Result.data[i] = 0) and (i &#62;= 0) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;Dec(i);</div><div class="code_line">&nbsp;&nbsp;Inc(i);</div><div class="code_line">&nbsp;&nbsp;if i &#60; len1 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(Result.data,i);</div><div class="code_line">&nbsp;&nbsp;Result.flag := i;</div><div class="code_line">end;</div></ol></div></div></div></div><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">function SubMemDWord(const P1; P2: Cardinal;var Res; Length: Integer): Cardinal; assembler;</div><div class="code_line">asm</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ESI,P1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDI,Res</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDX,P2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ECX,Length</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AND &nbsp; &nbsp; ECX,ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JLE &nbsp; &nbsp; @exit</div><div class="code_line">@@2: &nbsp; &nbsp;LODSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SBB &nbsp; &nbsp; EAX,EDX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;STOSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDX,0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JNC &nbsp; &nbsp; @@1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LOOP &nbsp; &nbsp;@@2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;INC &nbsp; &nbsp; EDX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JMP &nbsp; &nbsp; @exit</div><div class="code_line">&nbsp;</div><div class="code_line">@@1:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;REP &nbsp; &nbsp; MOVSD</div><div class="code_line">@exit: &nbsp;MOV &nbsp; &nbsp; EAX,EDX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ESI</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function SubMem(const P1, P2;var Res; Length: Integer): Cardinal; assembler;</div><div class="code_line">asm</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ESI,P1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDI,Res</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDX,P2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ECX,Length</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AND &nbsp; &nbsp; ECX,ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JLE &nbsp; &nbsp; @@1</div><div class="code_line">@@2: &nbsp; &nbsp;LODSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SBB &nbsp; &nbsp; EAX,[EDX]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;STOSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LEA &nbsp; &nbsp; EDX,[EDX+4]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LOOP &nbsp; &nbsp;@@2</div><div class="code_line">@@1: &nbsp; &nbsp;MOV &nbsp; &nbsp; EAX,0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JNC &nbsp; &nbsp; @exit</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;INC &nbsp; &nbsp; EAX</div><div class="code_line">&nbsp;</div><div class="code_line">@exit:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ESI</div><div class="code_line">end;</div></ol></div></div></div></div>Кстати нашел интересную ссылку: <a class='tag-url' href='http://www.delphisources.ru/pages/faq/base/huge_numbers.html' target='_blank'>Огромные числа</a>]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470076</guid>
        <pubDate>Mon, 11 Jan 2010 18:01:37 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470076</link>
        <description><![CDATA[Navi1982: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>sCreator</span><div class='quote '>Во-первых Вы не сравниваете op1 и op2? а сравниваете их длины.</div></div><br>
да... я забыл сказать, что так оно и есть, но это скоростное сравнение... Дополнительно надо будет дописать код поправки. Но на такие вот значения op1 и op2 это не влияет:<br>
op1 = &#036;012C (300)<br>
op2 = &#036;00C8 (200)<br>
<strong class='tag-b'>leo</strong>, спасибо тебе за анализ... Я действительно и сам понял что там бред какой-то, вот и поинтересовался у <strong class='tag-b'>sCreator</strong>&#39;а...<br>
Но и такой код тоже не канает :( - взял из книжки (асм).<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">{Функция вычетания: result = op1 - op2; only if |op1| &#62;= |op2|}</div><div class="code_line">Function HIModSub(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,len:integer;</div><div class="code_line">&nbsp;&nbsp;P1,P2,res:THugeInt;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;//проверка, если op1 больше или ровно op2!</div><div class="code_line">&nbsp;&nbsp;len:=length(op1.data);</div><div class="code_line">&nbsp;&nbsp;if len&#62;=length(op2.data) then</div><div class="code_line">&nbsp;&nbsp;begin &nbsp;//начинаем вычитане</div><div class="code_line">&nbsp;&nbsp; SetLength(res.data,len); res.flag:=len;</div><div class="code_line">&nbsp;&nbsp; SetLength(P1.data,len); P1.flag:=len;</div><div class="code_line">&nbsp;&nbsp; P1.data:=Copy(op1.data);</div><div class="code_line">&nbsp;&nbsp; SetLength(P2.data,len); P2.flag:=len;</div><div class="code_line">&nbsp;&nbsp; P2.data:=Copy(op2.data);</div><div class="code_line">asm</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EAX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDI,offset P1.data</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ESI,offset P2.data</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ECX,len</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLC</div><div class="code_line">@@1: &nbsp; &nbsp;LODSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SBB &nbsp; &nbsp; [EDI],EAX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EAX,[EDI]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;STOSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LOOP &nbsp; &nbsp;@@1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EAX</div><div class="code_line">end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">result.data:=Copy(res.data);</div><div class="code_line">result.flag:=res.flag;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470074</guid>
        <pubDate>Mon, 11 Jan 2010 18:00:49 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470074</link>
        <description><![CDATA[sCreator: <strong class='tag-b'>Navi1982</strong><br>
Во-первых Вы не сравниваете op1 и op2? а сравниваете их длины. У Вас выполнится 10 - 16<br>
Вот попробуйте функцию сравнения ( выдрал от туда же ). <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">// HIModCompare(const op1,op2:THugeInt): Integer;</div><div class="code_line">// -1 : op1 &#60; op2</div><div class="code_line">// &nbsp;0 : op1 = op2</div><div class="code_line">// &nbsp;1 : op1 &#62; op2</div><div class="code_line">function HIModCompare(const op1, op2: THugeInt): Integer;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function CompareMemDown(P1, P2: Pointer; Length: Integer): Integer; assembler;</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ESI,P1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDI,P2</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LEA &nbsp; &nbsp; ESI,[ESI+ECX-4] { point ESI to last dword of source &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LEA &nbsp; &nbsp; EDI,[EDI+ECX-4] { point EDI to last dword of dest &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;STD</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDX,ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;XOR &nbsp; &nbsp; EAX,EAX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AND &nbsp; &nbsp; EDX,3</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SAR &nbsp; &nbsp; ECX,2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JS &nbsp; &nbsp; &nbsp;@@1 &nbsp; &nbsp; // Negative Length implies identity.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;REPE &nbsp; &nbsp;CMPSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JNE &nbsp; &nbsp; @@2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ECX,EDX</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ADD &nbsp; &nbsp; ESI,4-1 &nbsp; &nbsp; &nbsp; &nbsp; { point to last byte of rest &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ADD &nbsp; &nbsp; EDI,4-1</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;REPE &nbsp; &nbsp;CMPSB</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JE &nbsp; &nbsp; &nbsp;@@1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOVZX &nbsp; EAX,BYTE PTR [ESI+1]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOVZX &nbsp; EDX,BYTE PTR [EDI+1]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JMP &nbsp; &nbsp; @@3</div><div class="code_line">&nbsp;</div><div class="code_line">@@2: &nbsp; &nbsp;MOV &nbsp; &nbsp; EAX,[ESI+4]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDX,[EDI+4]</div><div class="code_line">&nbsp;</div><div class="code_line">@@3: &nbsp; &nbsp;SUB &nbsp; &nbsp; EAX,EDX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EAX,1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JNC &nbsp; &nbsp; @@1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;NEG &nbsp; &nbsp; EAX</div><div class="code_line">&nbsp;</div><div class="code_line">@@1: &nbsp; &nbsp;CLD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ESI</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := CompareValue(length(op1.data), length(op2.data));</div><div class="code_line">&nbsp;&nbsp;if Result = 0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := CompareMemDown(op1.data, op2.data, length(op1.data) * 4);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470059</guid>
        <pubDate>Mon, 11 Jan 2010 17:45:17 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470059</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2470034'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2010-01-11T17:18:27+00:00">11.01.10, 17:18</time></span><div class='quote '>могли бы вы мне подсказать что я делаю не так??</div></div><br>
Юзаешь какой-то левый левый кусок асм-кода, не имеющий никакого отношения к вычитанию result = op1 - op2 <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2010-01-11T17:53:42+00:00">11.01.10, 17:53</time></span></span><br>
Бред какой-то:<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">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDX,P2.data &nbsp;//в EDX УКАЗАТЕЛЬ на массив P2.data</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;...</div><div class="code_line">@@2: &nbsp; &nbsp;LODSD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //грузим в EAX дворд из массива P1.data</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SBB &nbsp; &nbsp; EAX,EDX &nbsp; &nbsp; //?!! вычитаем из него УКАЗАТЕЛЬ на P2.data</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;STOSD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //сохраняем полученный мусор в res.data</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDX,0 &nbsp; &nbsp; &nbsp; //?!! зануляем EDX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JNC &nbsp; &nbsp; @@1 &nbsp; &nbsp; &nbsp; &nbsp; //?!! выходим из цикла если не было переноса, т.е. либо случайно на 1-й итерации, либо 100% на 2-й</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LOOP &nbsp; &nbsp;@@2</div></ol></div></div></div></div>]]></description>
        <author>leo</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470034</guid>
        <pubDate>Mon, 11 Jan 2010 17:18:27 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2470034</link>
        <description><![CDATA[Navi1982: sCreator, порылся я в твоих исходниках, позаимствовал твой код из SubMem... но в результате какая-то ерунда получается... Из ниже следующего кода выдает какой-то непонятный результат... Вобщем саму свою функцию уже переписал с тем подходом, чтобы переменные хранились отдельно, т.е. в функции... и все ровно что-то не так - результат в каждый раз бывает разным&#33; (точнее если получать несколько раз подряд результат, то он будет чередоватся с небольшим отклонением, но разным при каждом запуске программы)... могли бы вы мне подсказать что я делаю не так??<br>
<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">{Функция вычетания: result = op1 - op2; only if |op1| &#62;= |op2|}</div><div class="code_line">Function HIModSub(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,len:integer;</div><div class="code_line">&nbsp;&nbsp;P1,P2,res:THugeInt;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;//проверка, если op1 больше или ровно op2!</div><div class="code_line">&nbsp;&nbsp;len:=length(op1.data);</div><div class="code_line">&nbsp;&nbsp;if len&#62;=length(op2.data) then</div><div class="code_line">&nbsp;&nbsp;begin &nbsp;//начинаем вычитане</div><div class="code_line">&nbsp;&nbsp; SetLength(res.data,len); res.flag:=len;</div><div class="code_line">&nbsp;&nbsp; SetLength(P1.data,len); P1.flag:=len;</div><div class="code_line">&nbsp;&nbsp; P1.data:=Copy(op1.data);</div><div class="code_line">&nbsp;&nbsp; SetLength(P2.data,len); P2.flag:=len;</div><div class="code_line">&nbsp;&nbsp; P2.data:=Copy(op2.data);</div><div class="code_line">asm</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ESI,P1.data</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDI,res.data</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDX,P2.data</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ECX,len</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &#60;-- тут добавил я: направление</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLC &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &#60;-- тут добавил я: перенос</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AND &nbsp; &nbsp; ECX,ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JLE &nbsp; &nbsp; @exit</div><div class="code_line">@@2: &nbsp; &nbsp;LODSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SBB &nbsp; &nbsp; EAX,EDX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;STOSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDX,0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JNC &nbsp; &nbsp; @@1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;LOOP &nbsp; &nbsp;@@2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;INC &nbsp; &nbsp; EDX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JMP &nbsp; &nbsp; @exit</div><div class="code_line">&nbsp;</div><div class="code_line">@@1:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CLD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;REP &nbsp; &nbsp; MOVSD</div><div class="code_line">@exit: &nbsp;MOV &nbsp; &nbsp; EAX,EDX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ESI</div><div class="code_line">end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">result.data:=Copy(res.data);</div><div class="code_line">result.flag:=res.flag;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2464336</guid>
        <pubDate>Sat, 02 Jan 2010 10:53:31 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2464336</link>
        <description><![CDATA[Navi1982: <span class="tag-color tag-color-named" data-value="red" style="color: red">Всех с наступившим Новым Годом&#33; Желаю всем здоровья, успехов, счастья и исполнения желаний&#33;</span><br>
<br>
Почитал, подумал... убидили. Можно разделить процесс записи на диск от вычислений над массивами из длинных чисел. Но, некоторый нюансик все же есть... Что быстрее: хранить длину массива или в каждый раз ее спрашивать через функцию length(num.data) ?? Просто любопытно.]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2460358</guid>
        <pubDate>Sat, 26 Dec 2009 15:41:32 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2460358</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2460233'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-12-26T12:43:45+00:00">26.12.09, 12:43</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2458275'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>sCreator &#064; <time class="tag-quote__quoted-time" datetime="2009-12-23T21:20:41+00:00">23.12.09, 21:20</time></span><div class='quote '>Не брать же каждый раз модуль для длинны</div></div><br>
Как вариант можно пользоватся операциями сдвига (3 такта).</div></div><br>
Можно, но не нужно, т.к. проще через And:<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">len:=num.flag and MaxInt;</div></ol></div></div></div></div><br>
Хотя оперировать мегабайнтыми массивами и экономить 4 байта на знаке - это конечно нонсенс ;)]]></description>
        <author>leo</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2460290</guid>
        <pubDate>Sat, 26 Dec 2009 13:54:59 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2460290</link>
        <description><![CDATA[sCreator: Раскритиковать, это я всегда пожалуйста  ;) .<br>
Так зачем Вам хранить отдельно длинну массива? Вы будете задавать упреждающую размерность с большей вероятностью наткнуться на нехватку памяти?<br>
Вы пытаетесь сэкономить на знаке, выделив ему вместо байта бит - вот Вам экономия в 3 байта: sizeOf(num.flag)=4 байта, sizeOf(num.znak)=1 байт.( если, конечно, выберите выравнивание полей по 1 байту, но даже лишние 8 байт в одном числе, как мне представляется, не будут главной причиной возможного переполнения памяти )<br>
Операция чтения, записи на диск намного медленнее вычислений, поэтому формирование, например такой структуры для записи не скажется на самой скорости записи:<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>4 Б - сигнатура файла ( для подтверждения что здесь записаны длинные числа, например строка &#39;BigI&#39; )<br>
[2 Б - версия]<br>
4 Б - общий размер записи на одно число<br>
[&lt;контрольная сумма записи&gt;]<br>
1 Б - знак<br>
4 Б - размер массива<br>
&lt;сам массив&gt;<br>
//Если общий размер больше<br>
1 Б - код дополнительного поля ( например 1 - коментарий к числу)<br>
4 Б - размер поля<br>
&lt;само поле&gt;<br>
//и так до конца общего размера записи</div></div><br>
<br>
Про сдвиги на АСМе - а смысл, тогда переписывайте функцию заново,  вставляя АСМ. Или вынесите в отдельные функции и посчитайте такты.<br>
( и все ради того чтобы не выносить знак в отдельное поле? )<br>
<br>
И посмотрите все таки мои модули с классами ( сообщение 63 ). Что Вы их так боитесь? Вы же с формами работаете?<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">type</div><div class="code_line">&nbsp;&nbsp;TForm1 = class(TForm)</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ Private declarations }</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ Public declarations }</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
Это тоже определение класса.<br>
А методы - почти те-же функции. Поменяйте переменные и пользуйтесь. Тем более что там в отдельном модуле еще и АСМ функции - правда не так оптимизированные как функция преобразования из строки с АСМом ( сообщение 72 ), по подсказкам <strong class='tag-b'>leo</strong>. Вы ее сами то пробовали хоть?]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2460233</guid>
        <pubDate>Sat, 26 Dec 2009 12:43:45 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2460233</link>
        <description><![CDATA[Navi1982: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Не брать же каждый раз модуль для длинны.</div></div><br>
Как вариант можно пользоватся операциями сдвига (3 такта).<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">//получить длину числа</div><div class="code_line">len:=num.flag shl 1;</div><div class="code_line">len:=len shr 1;</div><div class="code_line">&nbsp;</div><div class="code_line">//тоже самое</div><div class="code_line">asm</div><div class="code_line">&nbsp;mov len, num.flag</div><div class="code_line">&nbsp;shl len, 1</div><div class="code_line">&nbsp;shr len, 1</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">//получить знак</div><div class="code_line">sign:=num.flag shr 31</div><div class="code_line">&nbsp;</div><div class="code_line">//тоже самое</div><div class="code_line">asm</div><div class="code_line">&nbsp;mov sign, num.flag</div><div class="code_line">&nbsp;shr sign, 31</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Пожалуста, расскритикуйте - интересно знать ваше мнение.]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2458275</guid>
        <pubDate>Wed, 23 Dec 2009 21:20:41 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2458275</link>
        <description><![CDATA[sCreator: Сперва немного в защиту моего формата: А почему именно определение на &gt; 0.<br>
Для выполнения основных операций достаточно знать что число не отрицательное:<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">res.znak := n1.znak xor n2.znak;</div></ol></div></div></div></div><br>
При сложении<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">if n1.znak xor n2.znak then // делаем вычитание массивов </div><div class="code_line">else // делаем сложение</div></ol></div></div></div></div><br>
( Подробности в модуле с интерфейсным классом, где уже реализованы сложение, вычитание и умножение с учетом знака )<br>
Не думаю что в Вашем варианте это проще - попробуйте прикинуть вариант реализации с <strong class='tag-b'>THugeInt</strong><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">num.data = nil</div></ol></div></div></div></div><br>
( И почему у Вас num.flag = 0 если длинна равна 1 - ведь флаг хранит знак и длинну ? )<br>
<br>
Хотя (-1, 0, 1) - хороший ход. ( но Boolean и nil помоему лучше - не люблю дублирования, можно получить трудноуловимую ошибку, достаточно не проследить в одном месте что число уже 0 или еще хуже когда оно уже не ноль, а в знаке осталось ).<br>
<br>
Про размер массива больший значимого должно быть отдельное решение, потому, что в начале упоминались числа близкие к 2^(2^32) и при манипуляции с такими числами лишняя память может оказаться критичной.<br>
Про мало ли на запас - в рекорде поля именованные и введение нового практически не скажется на старом коде. Хотя мое мнение прежнее - как лучший вариант скрыть хранение в приватных полях класса, но у <strong class='tag-b'>Navi1982</strong> с этим словом похоже плохие ассоциации.<br>
<br>
Хранить в типизированном файле по моему не дальновидно. Про шутку <strong class='tag-b'>Navi1982</strong> с битом так и не понял - что между двумя мегабайтными числами на вашем ЖД не найдетcя нескольких байт ?<br>
<br>
Как альтернативу могу предложить такой формат:<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">&nbsp;&nbsp;TBigZnak = -1..1;</div><div class="code_line">&nbsp;&nbsp;TBigInt = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;znak: TBigZnak; // хотя лучше все же Boolean</div><div class="code_line">&nbsp;&nbsp; &nbsp;len: cardinal;</div><div class="code_line">&nbsp;&nbsp; &nbsp;data: array of longword;</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
Не брать же каждый раз модуль для длинны.]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2458189</guid>
        <pubDate>Wed, 23 Dec 2009 19:39:07 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2458189</link>
        <description><![CDATA[Navi1982: мда... действительно... вы оба правы... у меня не учитывается длина меньшего числа. А как лучше (и быстрее) сделать? Дублировать меньшее число в памяти с учетом длины большего числа или переделать цыкл?... например вот так:<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">{Функция сложения}</div><div class="code_line">Function HIAdd(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,len,lenmax:integer;</div><div class="code_line">&nbsp;&nbsp;t:Int64;</div><div class="code_line">&nbsp;&nbsp;cr:array [0..1] of cardinal absolute t;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;//возмем число за основу</div><div class="code_line">&nbsp;&nbsp;if abs(op1.flag)&#60;abs(op2.flag) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;len:=abs(op1.flag); lenmax:=abs(op2.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(result.data,lenmax); //определим размер результата</div><div class="code_line">&nbsp;&nbsp; &nbsp;//начинаем сложение с младших элементов до минимальной длины</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:=0; //&#60;=&#62; cr[0..1]:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=0 to len-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op1.data[i])+int64(op2.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//далее прибавляем 0 с переносами до конца</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=len to lenmax-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op2.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end else //abs(op1.flag)&#62;=abs(op2.flag)</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;len:=abs(op2.flag); lenmax:=abs(op1.flag);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(result.data,lenmax); //определим размер результата</div><div class="code_line">&nbsp;&nbsp; &nbsp;//начинаем сложение с младших элементов до минимальной длины</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:=0; //&#60;=&#62; cr[0..1]:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=0 to len-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op1.data[i])+int64(op2.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//далее прибавляем 0 с переносами до конца</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=len to lenmax-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;t:=int64(op1.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;//учтем значение последнего переноса</div><div class="code_line">&nbsp;&nbsp;if t&#62;$FFFFFFFF then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;lenmax:=lenmax+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(result.data,lenmax);</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.data[lenmax-1]:=cr[1];</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;result.flag:=lenmax; //длина результата</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2458141</guid>
        <pubDate>Wed, 23 Dec 2009 18:21:33 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2458141</link>
        <description><![CDATA[Navi1982: sCreator, по поводу вами предложенного формата... Я сперва тоже так хотел сделать. Но при сохранении на ЖД этот бит всеровно придется куда-нибудь &quot;клеить&quot;... Или же придется выделять минимум 1 байт для его хранения раздельно. Для чего я сделал поле flag? А для того чтобы в нем хранить как размер, так и знак числа. Но, ты возможно возразишь и скажешь: &quot;функция length(*.data) возвращает размер числа&quot;. Но представим себе, что мы записываем на ЖД рекорд с полем дата... Причем несколько подряд... Поидее, сначала записывается (в твоем варианте) поле znak (1 байт), затем поле data (n_elem*4=№ байт)... потом следующий рекорд и т.д. ... может я не прав?... но, обращаю внимание на то, что записывается лишь содержимое массива data, который не содержит &quot;нулевого&quot; элемента (как в String) содержащего информацию о длине.<br><br>Но что происходит, когда мы начинаем читать эти рекорды? первый байт прочитается без проблем, т.к. он имеет шаблон (размерность)... Но тип data не имеет размерности, пока не задаш ее длину функцией SetLength... Но на каком основании задать эту длину?... Вот тут то я и придумал переменную flag. Да и функцию length можно с этим учетом вызывать резже... Хотя BugHunter правильно сделал, когда переменную falg типизировал как integer (32bit) вместо моего варианта Cardinal, где бы приходилось писать лишний код для установления и проверки знака (сразу не додумался).<br><br>Конечно я не отрицаю и тот момент, что упаковывать знак и длину можно прямо перед самой записью, т.е. вызвать length и добавить знак в последний бит, тем самым обозначить в четырех байтах знак и длину считывания в поле data.<br><br>А в коде можно пользоватся и конфигурацией с полем znak... Хотя если заглянуть в память программы, то для znak будет выделено 1 байт - это даже в хелпе написанно (где-то встречал).<br><br>Нусь, это сугубо мое мнение...]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2458113</guid>
        <pubDate>Wed, 23 Dec 2009 17:38:55 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2458113</link>
        <description><![CDATA[Bug Hunter: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2456904'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-12-22T17:49:41+00:00">22.12.09, 17:49</time></span><div class='quote '><div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>BugHunter</span><div class='quote '>Т.е. сложение по твоим замерам работает вообще мгновенно&#33;</div></div><br>
Вот и я об этом же... Любопытно, от чего так происходит?</div></div><br>
Сложение - гораздо более быстрая операция, чем умножение. И операция сложения при сложении двух длинных чисел производится принципиально меньшее число раз, чем операция умножения при конвертировании. Так что ничего странного.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2456904'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-12-22T17:49:41+00:00">22.12.09, 17:49</time></span><div class='quote '><div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>sCreator</span><div class='quote '>Функция не будет правильно складывать числа разной длины ...</div></div><br>
Это еще почему? Покамись складываются нормально...</div></div><br>
Потому, что для меньшего числа у тебя будет происходить выход за границу динамического массива с непредсказуемыми последствиями. А нормально у тебя складывается пока потому, что фишка так легла, что за границей находятся нули, но в общем случае так не будет.]]></description>
        <author>Bug Hunter</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2458101</guid>
        <pubDate>Wed, 23 Dec 2009 17:27:10 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2458101</link>
        <description><![CDATA[Bug Hunter: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2457170'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>sCreator &#064; <time class="tag-quote__quoted-time" datetime="2009-12-23T06:14:49+00:00">23.12.09, 06:14</time></span><div class='quote '>Bug Hunter - интересно Ваше мнение по поводу предложенного мной формата хранения длинного числа:<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">TBigNum = record </div><div class="code_line">&nbsp;&nbsp; &nbsp;znak: boolean; </div><div class="code_line">&nbsp;&nbsp; &nbsp;data: array of longword; </div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div></div></div><br>
Ну, смотри: в моем формате проверка числа на то, что оно = 0, делается так:<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">&nbsp;&nbsp;if num.flag = 0 then ...</div></ol></div></div></div></div><br>
а на то, что оно &gt; 0, так<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">&nbsp;&nbsp;if num.flag &#62; 0 then ...</div></ol></div></div></div></div><br>
А у тебя соответственно так:<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">&nbsp;&nbsp;if (not num.znak) and (length(num.data)=1) and (num.data[0]=0) then ...</div></ol></div></div></div></div><br>
и так:<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">&nbsp;&nbsp;if (not num.znak) and (not ((length(num.data)=1) and (num.data[0]=0))) then ...</div></ol></div></div></div></div><br>
Улавливаешь разницу? <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2457170'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>sCreator &#064; <time class="tag-quote__quoted-time" datetime="2009-12-23T06:14:49+00:00">23.12.09, 06:14</time></span><div class='quote '>Зачем хранить длину массива в отдельном поле?</div></div><br>
Ну, для удобства сравнения достаточно в flag хранить только знак числа (-1, 0 или +1}, но мало ли что понадобиться...<br>
<br>
Например, возможно, для того, чтобы не войдохать лишний раз динамическую память, может оказаться полезным хранить числа так, чтобы число значимых двойных слов было меньше размера data. Или можно хранить в flag число значимых бит в числе. Или число значимых бит в последнем неполном двойном слове. Да мало ли еще чего можно придумать - резерв не помешает. Тем более, что ты своим булёном ничего не экономишь - размер струкруры все равно по умолчанию выводится на величину, кратную восьми, и я не вижу причин от этого отказываться - разьве что в сторону увеличения.]]></description>
        <author>Bug Hunter</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2457170</guid>
        <pubDate>Wed, 23 Dec 2009 06:14:49 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2457170</link>
        <description><![CDATA[sCreator: <strong class='tag-b'>Bug Hunter</strong> - интересно Ваше мнение по поводу предложенного мной формата хранения длинного числа:<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">TBigNum = record </div><div class="code_line">&nbsp;&nbsp; &nbsp;znak: boolean; </div><div class="code_line">&nbsp;&nbsp; &nbsp;data: array of longword; </div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
Зачем хранить длину массива в отдельном поле ? если, например у <strong class='tag-b'>Navi1982</strong> в функции сложения в конце пишется<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">result.flag:=len;</div></ol></div></div></div></div>А в начале<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">len:=length(op1.data);</div></ol></div></div></div></div>]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2456904</guid>
        <pubDate>Tue, 22 Dec 2009 17:49:41 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2456904</link>
        <description><![CDATA[Navi1982: :blush: Ой... Глубоко сожалею, что неправильно вас понял на счет авторства... совсем запутался... И поскольку вы между собой договорились - я уже это обстоятельство принимаю на веру. Однако, важность авторства должна будет сохранится... и вот почему...<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><em class='tag-i'>...BugHunter и sCreator, загляните в приват, там следующий фрагмент этого поста...</em></span><br>
...<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>BugHunter</span><div class='quote '>Т.е. сложение по твоим замерам работает вообще мгновенно&#33;</div></div><br>
Вот и я об этом же... Любопытно, от чего так происходит?<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>sCreator</span><div class='quote '>Функция не будет правильно складывать числа разной длины ...</div></div><br>
Это еще почему? Покамись складываются нормально...<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>...и не учитывает знак.</div></div><br>
Да - это так и есть. А разве я этого не отмечал?&#33;  :blush: <br>
<br>
Вобщем жду ваших мнений...<br>
<br>
P.S.&gt;На приват отвечаем приватом :)]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2454368</guid>
        <pubDate>Sun, 20 Dec 2009 07:34:23 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2454368</link>
        <description><![CDATA[sCreator: Присоединяюсь к критике.<br>
THugeInt предложил Bug Hunter. Мое предложение было в использовании интерфейсного объекта. Если выделить из него в виде record то выглядит так:<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">&nbsp;&nbsp;TBigNum = record </div><div class="code_line">&nbsp;&nbsp; &nbsp;znak: boolean; </div><div class="code_line">&nbsp;&nbsp; &nbsp;data: array of longword; </div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div>Не вижу смысла хранить длину если Length() от динамического массива просто считывает ее по отрицательным адресам.<br>
Функция не будет правильно складывать числа разной длины и не учитывает знак.<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">TimeSta:=Time;</div><div class="code_line">res:=HIAdd(num1,num2);</div><div class="code_line">TimeFin:=Time;</div></ol></div></div></div></div>]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2454280</guid>
        <pubDate>Sat, 19 Dec 2009 21:58:06 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2454280</link>
        <description><![CDATA[Bug Hunter: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2453630'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-12-18T19:53:20+00:00">18.12.09, 19:53</time></span><div class='quote '>Выглядит она сырова-то, но за-то работает... </div></div><br>
Хм... Глядя на исходник, я бы не сказал, что функция твоя правильно работает для чисел с разной длинной data. <br>
<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">{$R+}</div></ol></div></div></div></div><br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2453630'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-12-18T19:53:20+00:00">18.12.09, 19:53</time></span><div class='quote '>на конвертирование числа из 100000 цыфр (10сс) уходит примерно 0,8 секунд (включая: форматроване ~0,032сек; конвертирование ~0,768сек), то на сложение двух чисел по 100000 уходит примерно 1,6 сек&#33;&#33;&#33; (т.е. форматирование + конвертирование 1-го числа, затем 2-го, и затем само сложение)... Незнаю почему так получается</div></div><br>
И что тут странного? Если у тебя на форматирование и конвертирование ОДНОГО числа уходит 0.8 сек, то на то же для ДВУХ чисел аккурат должно уходить 1.6 сек. Т.е. сложение по твоим замерам работает вообще мгновенно&#33;<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2453630'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-12-18T19:53:20+00:00">18.12.09, 19:53</time></span><div class='quote '>Использовал тип THugeInt, предложенного sCreator&#39;ом.</div></div><br>
Лучше все таки ты бы посмотрел повнимательнее на тип THugeInt, предложенный мной. У меня используется знаковый flag, поэтому проверка знака числа производится проверкой знака flag, без громоздкой проверки старшего бита, а длина data дается выражением abs(flag) без, опять же, громоздкого выделения старших бит.<br>
<br>
Число ноль в моем типе THugeInt хранится так:<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">&nbsp;&nbsp;*.data:=nil;</div><div class="code_line">&nbsp;&nbsp;*.flag:=0;</div></ol></div></div></div></div><br>
ИМХО, так удобнее.]]></description>
        <author>Bug Hunter</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2453630</guid>
        <pubDate>Fri, 18 Dec 2009 19:53:20 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2453630</link>
        <description><![CDATA[Navi1982: Спустя 10 дней, с перебоями приступая к программированию, убийственно уставшим от работы, наконец-таки написал функцию сложения... Выглядит она сырова-то, но за-то работает... И я бы сказал не так уж и медленно&#33; Если, на конвертирование числа из 100000 цыфр (10сс) уходит примерно 0,8 секунд (<em class='tag-i'>включая: форматроване ~0,032сек; конвертирование ~0,768сек</em>), то на сложение двух чисел по 100000 уходит примерно 1,6 сек&#33;&#33;&#33; (<em class='tag-i'>т.е. форматирование + конвертирование 1-го числа, затем 2-го, и затем само сложение</em>)... Незнаю почему так получается, но думаю что в результате кэширования комманд и данных самим процессором, значительно уменьшается время выполнения процедур форматирования+конвертирования, а затем и самого сложения. (<em class='tag-i'>у меня CPU: DualCore Intel Pentium E2200, 2200 MHz (11 x 200), L2 1MB, <span class='tag-u'>L1 32kb code / 32kb data</span></em>)... В любом случае результат приемлим, особенно если его попытатся оптимизировать под ассемблеровскую вставку используя инструкции SSE# и регистры xmm0..xmm7 (128bit). Кстати, пробовал это делать с обычными инструкциями и регистрами (32 бит) - но к сожалению ничего не вышло. Видать, с меня ассемблеровиц тоже не важный  :blush: а пример брал из книжки.<br>
<br>
Вобщем, вот сама функция. Использовал тип THugeInt, предложенного <strong class='tag-b'>sCreator</strong>&#39;ом.<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">Function HIAdd(const op1,op2:THugeInt):THugeInt;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;i,len:integer;</div><div class="code_line">&nbsp;&nbsp;t:Int64;</div><div class="code_line">&nbsp;&nbsp;cr:array [0..1] of cardinal absolute t;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;//определим размер результата</div><div class="code_line">&nbsp;&nbsp;len:=length(op1.data);</div><div class="code_line">&nbsp;&nbsp;SetLength(result.data,len);</div><div class="code_line">&nbsp;&nbsp;if len&#60;length(op2.data) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;len:=length(op2.data);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(result.data,len);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;//начинаем сложение с младших элементов</div><div class="code_line">&nbsp;&nbsp;t:=0; //&#60;=&#62; cr[0..1]:=0;</div><div class="code_line">&nbsp;&nbsp;for i:=0 to len-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:=int64(op1.data[i])+int64(op2.data[i])+int64(cr[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.data[i]:=cr[0];</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;//учтем значение последнего переноса</div><div class="code_line">&nbsp;&nbsp;if t&#62;$FFFFFFFF then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;len:=len+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLength(result.data,len);</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.data[len-1]:=cr[1];</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;result.flag:=len; //длина результата</div><div class="code_line">end;</div></ol></div></div></div></div><br>
Ну и если добавить кнопку на форму, то в ее обработчике у меня следующий код:<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">procedure TForm3.btAddClick(Sender: TObject);</div><div class="code_line">Var i:Cardinal;</div><div class="code_line">&nbsp;&nbsp; &nbsp;num1,num2,res:THugeInt;</div><div class="code_line">&nbsp;&nbsp; &nbsp;t:String;</div><div class="code_line">begin</div><div class="code_line">LongTimeFormat:=&#39;hh:nn:ss:zzz&#39;;</div><div class="code_line">TimeSta:=Time;</div><div class="code_line">TestStr:=FormatStr(form3.Edit1.Text);</div><div class="code_line">form3.Edit1.Text:=TestStr;</div><div class="code_line">num1:=StrToHugeInt(TestStr);</div><div class="code_line">TestStr:=FormatStr(form3.Edit2.Text);</div><div class="code_line">form3.Edit2.Text:=TestStr;</div><div class="code_line">num2:=StrToHugeInt(TestStr);</div><div class="code_line">res:=HIAdd(num1,num2);</div><div class="code_line">t:=&#39;&#39;;</div><div class="code_line">for i:=res.flag-1 downto 0 do</div><div class="code_line">begin</div><div class="code_line">&nbsp;t:=t+IntToHex(res.data[i],8);</div><div class="code_line">end;</div><div class="code_line">form3.Edit3.Text:=t;</div><div class="code_line">TimeFin:=Time;</div><div class="code_line">form3.Label1.Caption:=TimeToStr(TimeFin-TimeSta);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Какие будут идеи по функции вычитания? Т.е. как эффективнее учитывать перенос и определить длину результата? У меня есть пример из книжки по ассемблеру для вычитания, тока пример оттуда-же для сложения, как я писал выше, увенчался неудачей - ну не понимает дельфя все то что понимает TASM/MASM.<br>
<br>
На следующей недельке постараюсь написать вычитание. У нас снег выпал, а работа ремонтника+монтажника кабельной сети в частных секторах (1 городок и 1 столичный пригород) - с пешими прогулками и лазаньем по столбам, да и заморочками клиентов - сильно выматывает... а работы - непочатый край, а вознаграждение - рабское... ууу... это уже оффтоп... пора спать&#33;  :jokingly:]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2444743</guid>
        <pubDate>Wed, 09 Dec 2009 08:35:46 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2444743</link>
        <description><![CDATA[sCreator: <strong class='tag-b'>Navi1982</strong> - не забудь здесь упомянуть созданную тему, а то могу пропустить.]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2444585</guid>
        <pubDate>Tue, 08 Dec 2009 21:58:22 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2444585</link>
        <description><![CDATA[Bug Hunter: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2444548'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-12-08T20:55:56+00:00">08.12.09, 20:55</time></span><div class='quote '>пробовал сам разобратся в скоростном варианте от BugHunter&#39;а предложенного sCreator&#39;ом (вариант с THugeInt) - немного стал улавливать идею... Однако, хотелось бы от авторов узнать теоритическую часть данного перевода. Если, незатруднит, пожалуста приведите на словах общие шаги преобразования? Думаю так легче будет понять суть кода.</div></div><br>
Суть там простая - схема Горнера. Ускорение получается за счет того, что в 2^32 цифрах умножение на 10 и на 10^9 по трудоемкости одинаковые операции. Плюс само умножение на цифру пре переходе с 2^16 на 2^32 стало в четыре раза быстрее.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2444548'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-12-08T20:55:56+00:00">08.12.09, 20:55</time></span><div class='quote '>И надо не забыть про функцию обратного перевода из 2^XXcc -&gt; в 10сс (т.е. HugeIntToStr)- а поскольку, исходя из выше приведенных мной примеров, с меня &quot;переводчик&quot; не ах-ти какой, то полностью рассчитываю на вашу помощь</div></div><br>
Идея обратного перевода точно такая же - делим на 10^9, получившийся остаток переводим в строку стандартной функцией преобразования, не забывая дополнять при необходимости нулями слева для непоследнего фрагмента, фрагменты стыкуем в выходную строку функцией insert.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2444548'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-12-08T20:55:56+00:00">08.12.09, 20:55</time></span><div class='quote '>А вот с делением у меня плохо</div></div><br>
У меня тоже - как-то не было необходимости с этим разбираться. Но если надыбаешь описание алгоритма и/или пример, думаю смогу разобраться.]]></description>
        <author>Bug Hunter</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2444548</guid>
        <pubDate>Tue, 08 Dec 2009 20:55:56 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2444548</link>
        <description><![CDATA[Navi1982: Всем, привет&#33;<br>
Ну, вот я вернулся из коммандировки и мне не терпелось вновь взятся за начатое... Посидел пару часиков чтобы вспомнить на чем остановились... Немного отстал мыслями на счет методов перевода, пробовал сам разобратся в скоростном варианте от <strong class='tag-b'>BugHunter</strong>&#39;а предложенного <strong class='tag-b'>sCreator</strong>&#39;ом (вариант с THugeInt) - немного стал улавливать идею... Однако, хотелось бы от авторов узнать теоритическую часть данного перевода. Если, незатруднит, <em class='tag-i'><span class="tag-color tag-color-named" data-value="blue" style="color: blue">пожалуста приведите на словах общие шаги преобразования?</span></em> Думаю так легче будет понять суть кода.<br>
<br>
В остальном - можно уже переходить на операции <em class='tag-i'>сложения</em>, <em class='tag-i'>вычетания</em>, <em class='tag-i'>умножения </em>(эти я сам скоро приведу в пример), <em class='tag-i'>деления </em>и <em class='tag-i'>возведения в степень</em>. И надо не забыть про функцию обратного перевода из 2^XXcc -&gt; в 10сс (т.е. <em class='tag-i'>HugeIntToStr</em>)- а поскольку, исходя из выше приведенных мной примеров, с меня &quot;переводчик&quot; не ах-ти какой, то полностью рассчитываю на вашу помощь (и в часности на <strong class='tag-b'>BugHunter</strong>&#39;а и <strong class='tag-b'>sCreator</strong>&#39;а).<br>
<br>
Что касается первых двух (+ и -), то я просмотрел кое-какую литературу по применению инструкций из набора SSE2, так-что пишу уже с использованием регистров 128-бит (xmm0..xmm7). <em class='tag-i'>Умножение </em>в принцыпе тоже можно реализовать с приминением 2 регистров по 128-бит для хранения промежуточного результата (но, еще обдумаю). А вот с <em class='tag-i'>делением </em>у меня плохо - за-то <strong class='tag-b'>BugHunter</strong> и <strong class='tag-b'>sCreator</strong> в этом здорого соображают. На счет <em class='tag-i'>возведения в степень</em>, мысль примерно такая - использовать сдвиги.<br>
<br>
Скоро создам новую темку с готовыми исходниками наработанных вещей.]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2434630</guid>
        <pubDate>Sat, 28 Nov 2009 07:15:52 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2434630</link>
        <description><![CDATA[sCreator: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2432910'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>leo &#064; <time class="tag-quote__quoted-time" datetime="2009-11-26T10:10:11+00:00">26.11.09, 10:10</time></span><div class='quote '>Мануалы по оптимизации на оф.сайтах Intel и AMD (... Оptimization Manual) + труды А.Фога</div></div><br>
Спасибо. ( про АПИ читаем в MSDN, а при асме про Intel не подумал ) .]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2432910</guid>
        <pubDate>Thu, 26 Nov 2009 10:10:11 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2432910</link>
        <description><![CDATA[leo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2432297'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>sCreator &#064; <time class="tag-quote__quoted-time" datetime="2009-11-25T17:32:12+00:00">25.11.09, 17:32</time></span><div class='quote '>про оптимизацию под современные процессоры ничего толком не нашел.</div></div><br>
Все толковое - на аглицком ;) <br>
Мануалы по оптимизации на оф.сайтах Intel и AMD (... Оptimization Manual) + труды <a class='tag-url' href='http://www.agner.org/optimize' target='_blank'>А.Фога</a>]]></description>
        <author>leo</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2432580</guid>
        <pubDate>Wed, 25 Nov 2009 22:16:25 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2432580</link>
        <description><![CDATA[Bug Hunter: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2431383'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-11-24T20:23:06+00:00">24.11.09, 20:23</time></span><div class='quote '>Как на счет продолжить реализовать удобный и быстрый модуль длинной арифметики для дельфи?</div></div><br>
Ну, посмотреть на алгоритм деления длинных чисел и попробовать его улутшить было бы интересно.<br>
<br>
И поиграться с обратным преобразованием BIN-&gt;DEC - тоже.]]></description>
        <author>Bug Hunter</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2432523</guid>
        <pubDate>Wed, 25 Nov 2009 21:04:23 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2432523</link>
        <description><![CDATA[Navi1982: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>sCreator</span><div class='quote '>Если продолжать делать реализацию, то лучше новую тему.<br>
Только сперва определиться хотя бы с каркасом ( базовой моделью ) модуля,...</div></div><br>
<br>
Я тоже об этом много думал... Так и сделаю. На счет каркаса - покамись думаю сделать простой модуль, т.е. без классов (мало практики с ними). Чисто набор функций (и процедур) - возвращающие результат.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>sCreator</span><div class='quote '>...если Ты получил промежуточный результат, значит у Тебя уже есть реализации основных операций,...</div></div><br>
<br>
Сразу извиняюсь за офф-топ, но... Я пользовался не своими реализациями, а языком программирования Ruby, который достаточно медлителен из за того что у него отсувствует стадия компиляции. Код программы вводится в интерпретатор команд которые исполняются &quot;по ходу считывания&quot;. Два дня назад стал изучать элементы программирования на этом языке, но лишь в целях предварительных иследований для основной программы и оценки скорости будущего модуля длинной арифметики (в будущем) реализованного на дельфи. В Ruby жутко неудобно писать код из-за отсувствия привычных цыклов. Вместо последних там сделан упор на манипуляции обработки массивов. (сдесь все есть для начинающих: http://ru.wikibooks.org/wiki/Ruby). Конец офф-топа. :whistle:<br>
<br>
Но не стану скромничать, год назад я сделал несколько нароботок для модуля длинной арифметики. Правда, он получился очень корявым и функции разработанны для 10сс, совсем без упора на ускорение.<br>
Что касается времени, то у меня у самого выпадает пара дней в неделю для посещения данного форума. Да и занятся программированием (т.е. хобби) вобще.<br>
<br>
P.S.&gt; I&#39;ll be back... soon ;)]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2432297</guid>
        <pubDate>Wed, 25 Nov 2009 17:32:12 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2432297</link>
        <description><![CDATA[sCreator: <strong class='tag-b'>leo</strong>,<br>
Замечания - подсказки с благодарностью принимаю.<br>
Мое последнее общение с асмом до этого было еще на Синклере.<br>
А сейчас похоже и самому немного пригодится - немного мучу с обработкой звука и склоняюсь к небольшим асмовским вставкам.<br>
Вот только скачал в последнее время более 200 метром литературы по асму ( почти вся в карзину ), а про оптимизацию под современные процессоры ничего толком не нашел.<br>
Если что посоветуете 9 ссылочка или электронная литература ) - буду благодарен.]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2431880</guid>
        <pubDate>Wed, 25 Nov 2009 11:12:48 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2431880</link>
        <description><![CDATA[leo: Навскидку парочка замечаний по асму:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2431790'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>sCreator &#064; <time class="tag-quote__quoted-time" datetime="2009-11-25T09:57:26+00:00">25.11.09, 09:57</time></span><div class='quote '><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">&nbsp;&nbsp; &nbsp; AND &nbsp; &nbsp; ECX,ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; JLE &nbsp; &nbsp; @exit</div><div class="code_line">&nbsp;&nbsp; &nbsp; ...</div><div class="code_line">&nbsp;&nbsp; &nbsp; AND &nbsp; &nbsp; EBX,EBX</div><div class="code_line">&nbsp;&nbsp; &nbsp; JNZ &nbsp; &nbsp; @@2</div></ol></div></div></div></div></div></div><br>
Вместо and лучше юзать test - как рекомендуют во всех мануалах Intel и AMD<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2431790'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>sCreator &#064; <time class="tag-quote__quoted-time" datetime="2009-11-25T09:57:26+00:00">25.11.09, 09:57</time></span><div class='quote '><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">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;JNC &nbsp; &nbsp; @@nc</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;INC &nbsp; &nbsp; EDX</div><div class="code_line">&nbsp;&nbsp;@@nc: &nbsp; MOV &nbsp; &nbsp; ESI,EDX &nbsp; &nbsp;{save EDX}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LOOP &nbsp; &nbsp;@@2</div></ol></div></div></div></div></div></div><br>
1) jnc+inc = adc edx,0<br>
2) на современных компах loop - это тормоз, лучше dec ecx + jnz @@2 (а еще лучше sub ecx,1 ;))]]></description>
        <author>leo</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2431790</guid>
        <pubDate>Wed, 25 Nov 2009 09:57:26 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2431790</link>
        <description><![CDATA[sCreator: Кстати, посмотрел свежим взглядом на свою последнюю функцию перевода - нашел еще что оптимизировать.<br>
Ведб можно одновременно умножать и прибавлять<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">Function FStrToBigNumDWL(const Val: string): THugeInt;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function MulAddMemWithDWordD(pp1: PCardinal; p2, pAdd: cardinal; len: integer)</div><div class="code_line">&nbsp;&nbsp; &nbsp;: integer;</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;ak, ap2: Int64;</div><div class="code_line">&nbsp;&nbsp; &nbsp;akl: array [0 .. 1] of cardinal absolute ak;</div><div class="code_line">&nbsp;&nbsp; &nbsp;k: Integer;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;akl[1] := pAdd;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ap2 := p2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for k := 1 to len do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ak := ap2 * pp1^ + akl[1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pp1^ := akl[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc(pp1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if akl[1] &#60;&#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pp1^ := akl[1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Inc(len);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := len;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i, len, slen, olen, sDw: integer;</div><div class="code_line">&nbsp;&nbsp;s: string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;len := length(Val);</div><div class="code_line">&nbsp;&nbsp;if len = 0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.data := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.flag := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;if (Val[1] in [&#39;+&#39;, &#39;-&#39;, &#39; &#39;]) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;i := 2</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;i := 1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;olen := (len - i + 1);</div><div class="code_line">&nbsp;&nbsp;slen := (olen div 9);</div><div class="code_line">&nbsp;&nbsp;olen := olen mod 9;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;setlength(result.data, slen + 2);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;slen := slen * 9;</div><div class="code_line">&nbsp;&nbsp;sDw := 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;while i &#60; slen do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;s := Copy(Val, i, 9);</div><div class="code_line">&nbsp;&nbsp; &nbsp;inc(i, 9);</div><div class="code_line">&nbsp;&nbsp; &nbsp;sDw := MulAddMemWithDWordD(@result.data[0], 1000000000, StrToInt(s), sDw);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if olen &#62; 0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;s := Copy(Val, i, olen);</div><div class="code_line">&nbsp;&nbsp; &nbsp;len := 10;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i := 2 to olen do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;len := len * 10;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sDw := MulAddMemWithDWordD(@result.data[0], len, StrToInt(s), sDw); </div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;setlength(result.data, sDw);</div><div class="code_line">&nbsp;&nbsp;if (Val[1] = &#39;-&#39;) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.flag := cardinal(sDw) or 000000</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.flag := cardinal(sDw);</div><div class="code_line">end;</div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2009-11-25T10:25:43+00:00">25.11.09, 10:25</time></span></span><br>
И тоже с асмом<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">Function FStrToBigNumDWL(const Val: string): THugeInt;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function MulAddMemWithDWordD(pp1: PCardinal; p2, pAdd: cardinal; len: integer)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;: integer; &nbsp;assembler;</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PUSH &nbsp; &nbsp;EBX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EDI,pp1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ESI,pAdd</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EBX,P2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ECX,len</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TEST &nbsp; &nbsp;ECX,ECX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;JLE &nbsp; &nbsp; @exit</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CLD</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TEST &nbsp; &nbsp;EBX,EBX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;JNZ &nbsp; &nbsp; @@2 &nbsp; &nbsp; &nbsp; { p2 = 0 }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ p1 = pAdd }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; [EDI],ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;XOR &nbsp; &nbsp; EAX,EAX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;XOR &nbsp; &nbsp; ESI,ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ADD &nbsp; &nbsp; EDI,4</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SUB &nbsp; &nbsp; ECX,1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;REP &nbsp; &nbsp; STOSD</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;JMP &nbsp; &nbsp; @exit</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;@@2:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; EAX,[EDI]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MUL &nbsp; &nbsp; EBX &nbsp; &nbsp; &nbsp; &nbsp;{res= EDX:EAX}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ADD &nbsp; &nbsp; EAX,ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;STOSD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{Res = dest ( P1 )++}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ADC &nbsp; &nbsp; EDX,0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; ESI,EDX &nbsp; &nbsp;{save EDX}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SUB &nbsp; &nbsp; ECX,1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;JNZ &nbsp; &nbsp; @@2</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;@exit: &nbsp;MOV &nbsp; &nbsp; EAX,len</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TEST &nbsp; &nbsp;ESI,ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;JZ &nbsp; &nbsp; &nbsp;@@1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MOV &nbsp; &nbsp; [EDI],ESI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;INC &nbsp; &nbsp; EAX</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;@@1: &nbsp; &nbsp;POP &nbsp; &nbsp; EBX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; EDI</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;POP &nbsp; &nbsp; ESI</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i, len, slen, olen, sDw: integer;</div><div class="code_line">&nbsp;&nbsp;s: string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;len := length(Val);</div><div class="code_line">&nbsp;&nbsp;if len = 0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.data := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.flag := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;if (Val[1] in [&#39;+&#39;, &#39;-&#39;, &#39; &#39;]) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;i := 2</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;i := 1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;olen := (len - i + 1);</div><div class="code_line">&nbsp;&nbsp;slen := (olen div 9);</div><div class="code_line">&nbsp;&nbsp;olen := olen mod 9;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;setlength(result.data, slen + 2);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;slen := slen * 9;</div><div class="code_line">&nbsp;&nbsp;sDw := 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;while i &#60; slen do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;s := Copy(Val, i, 9);</div><div class="code_line">&nbsp;&nbsp; &nbsp;inc(i, 9);</div><div class="code_line">&nbsp;&nbsp; &nbsp;sDw := MulAddMemWithDWordD(@result.data[0], 1000000000, StrToInt(s), sDw);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if olen &#62; 0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;s := Copy(Val, i, olen);</div><div class="code_line">&nbsp;&nbsp; &nbsp;len := 10;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i := 2 to olen do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;len := len * 10;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sDw := MulAddMemWithDWordD(@result.data[0], len, StrToInt(s), sDw);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;setlength(result.data, sDw);</div><div class="code_line">&nbsp;&nbsp;if (Val[1] = &#39;-&#39;) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.flag := cardinal(sDw) or 000000</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.flag := cardinal(sDw);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Исправил асм по замечаниям <strong class='tag-b'>leo</strong>]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2431573</guid>
        <pubDate>Wed, 25 Nov 2009 05:15:00 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2431573</link>
        <description><![CDATA[sCreator: Если продолжать делать реализацию, то лучше новую тему.<br>
Только сперва определиться хотя бы с каркасом ( базовой моделью ) модуля, чтобы в новой теме в первом посте было краткое описание и прикреплен исходник, который по мере разработки обновлялся.<br>
Не искать же его по всей теме.<br>
<br>
Будет время подмогну реализовать.<br>
И, кстати, <strong class='tag-b'>Navi1982</strong> - если Ты получил промежуточный результат, значит у Тебя уже есть реализации основных операций, в том числе и преобразования числа в строку.]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2431383</guid>
        <pubDate>Tue, 24 Nov 2009 20:23:06 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2431383</link>
        <description><![CDATA[Navi1982: В принцыпе вопрос можно считать решенным... Однако хотел бы еще спросить, особенно <strong class='tag-b'>BugHunter</strong>&#39;a и <strong class='tag-b'>sCreator</strong>&#39;а:<br>
<br>
<span class="tag-color tag-color-named" data-value="green" style="color: green"><em class='tag-i'>Как на счет продолжить реализовать удобный и быстрый модуль длинной арифметики для дельфи?</em></span><br>
<br>
Ведь, штука очень интересная и может пригодится многим&#33; И место как раз подходящее - т.е. &quot;исходники&quot;  :) <br>
И в связи с этим другой вопрос:<br>
<br>
<span class="tag-color tag-color-named" data-value="green" style="color: green"><em class='tag-i'>Стоит открыть новую тему где будут выкладыватся готовые коды? Или же лучше выкладывать все в первом посте и продолжать тему?</em></span>]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2431356</guid>
        <pubDate>Tue, 24 Nov 2009 20:09:01 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2431356</link>
        <description><![CDATA[Navi1982: Вот&#33;... Наконец-таки удалось вычислить максимальное промежуточное значение в основной программе. Это число состоит из 134886 цыфр в 10сс. И равняется оно... ой... даже боюсь приводить...<br>...<br>...и правильно боялся - выдает ошибку, мол сообщение длинноватое... хех... еще-бы. Так что результат смотрите в файле тхт:]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2427660</guid>
        <pubDate>Sat, 21 Nov 2009 03:33:35 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2427660</link>
        <description><![CDATA[imgavario: Ага... мне тоже темка помогла с универскими лабами разобраться, респект&#33;<br>
__________________<br>
<span class='tag-size' data-value='8' style='font-size:8pt;'>Респект и уважуха&#33; <a class='tag-url' href='http://www.iskusstvenniy-kamen.ru/' target='_blank'>http://www.iskusstvenniy-kamen.ru/</a> - мой сайт</span>]]></description>
        <author>imgavario</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2425052</guid>
        <pubDate>Wed, 18 Nov 2009 16:25:01 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2425052</link>
        <description><![CDATA[Navi1982: Извиняюсь что пропал... Сегодня попробывал функцию BugHunter&#39;а и его-же написанную по мотивам sCreator&#39;а...<br>Вот результаты среднего времени конвертирования:<br>FStrToBigNum, &#39;9&#39; x 48000шт =&gt; 3,469 сек<br>FStrToBigNum, &#39;9&#39; x 100000шт =&gt; 14,968 сек<br><br>StrToHugeInt, &#39;9&#39; x 48000шт =&gt; 0,203 сек<br>StrToHugeInt, &#39;9&#39; x 100000шт =&gt; 0,797 сек<br>StrToHugeInt, &#39;9&#39; x 1000000шт =&gt; 76,375 сек<br><br>Долго отходя от шока, не знал шо сюда написать... Щас собираю провисшую челюсть с пола...  :o <br>++ обоим&#33;]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2424966</guid>
        <pubDate>Wed, 18 Nov 2009 14:51:10 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2424966</link>
        <description><![CDATA[sCreator: Вообще-то основная моя идея была в том, что бы сперва разработать операции длинной арифметики и на их основе уже преобразовывать строку в длинное число.<br>
А старые знания асма немного попользовал для убыстрения (хотя врядли он оптимальный ) . Работа с longword значительно быстрее работы с word, но longword * longword не влезает в Int64.<br>
Хорошо что миллиард на longword влезает.<br>
<br>
А мой алгоритм и без асма тоже неплохо работает ( правда убрал проверку строки ):<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">Function FStrToBigNumDWL(const Val: string): THugeInt;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function MulMemWithDWordD(pp1:PCardinal; p2:Cardinal; len: Integer): Cardinal;</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;ak, ap2: Int64;</div><div class="code_line">&nbsp;&nbsp; &nbsp;akl:array[0..1] of Cardinal absolute ak;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;akl[1] := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ap2 := p2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while true do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;dec(len);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ak := ap2 * pp1^ + akl[1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pp1^ := akl[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if len = 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Inc(pp1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := akl[1];</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;// и выдает следующую длинну</div><div class="code_line">&nbsp;&nbsp;function AddMemDWordD(pp1:PCardinal; p2:Cardinal; len: Integer): Integer;</div><div class="code_line">&nbsp;&nbsp;var</div><div class="code_line">&nbsp;&nbsp; &nbsp;i: Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ak: Int64;</div><div class="code_line">&nbsp;&nbsp; &nbsp;akl:array[0..1] of Cardinal absolute ak;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;ak := p2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;i := len;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while true do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Dec(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ak := ak + pp1^;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pp1^ := akl[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (akl[1] = 0) or (i = 0) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ak := akl[1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Inc(pp1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if i &#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Inc(pp1,i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if pp1^ &#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Inc(len);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := len;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i, len, slen, olen, sDw: Integer;</div><div class="code_line">&nbsp;&nbsp;s: string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;len := Length(Val);</div><div class="code_line">&nbsp;&nbsp;if len = 0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result.data := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result.flag := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;if (Val[1] in [&#39;+&#39;,&#39;-&#39;,&#39; &#39;]) then i:=2 else i:=1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;olen := (len - i + 1);</div><div class="code_line">&nbsp;&nbsp;slen := (olen div 9);</div><div class="code_line">&nbsp;&nbsp;olen := olen mod 9;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SetLength(Result.data, (slen + 2));</div><div class="code_line">&nbsp;&nbsp; &nbsp;FillChar(Result.data[0],Length(Result.data)*4,0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;slen := slen * 9;</div><div class="code_line">&nbsp;&nbsp;sDw := 1;</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;for i := 1 to len do</div><div class="code_line">&nbsp;&nbsp;while i &#60; slen do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;s := Copy(Val, i, 9);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Inc(i,9);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if sDw &#62; 1 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if MulMemWithDWordD(@Result.data[0], 1000000000, sDw) &#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;raise Exception.Create(&#39;Overflow &nbsp;in GetBigInt(const Val: String):IBigInt; (for)&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sDw := AddMemDWordD(@Result.data[0], StrToInt(s), sDw);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if olen &#62; 0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;s := Copy(Val, i, olen);</div><div class="code_line">&nbsp;&nbsp; &nbsp;len := 1; for i := 1 to olen do len := len * 10;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if sDw &#62; 1 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if MulMemWithDWordD(@Result.data[0], len, sDw) &#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;raise Exception.Create(&#39;Overflow &nbsp;in GetBigInt(const Val: String):IBigInt;&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;sDw := AddMemDWordD(@Result.data[0], StrToInt(s), sDw);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;i := sDw;</div><div class="code_line">&nbsp;&nbsp;while (Result.data[i] = 0) and (i &#62; 0) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;Dec(i);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SetLength(Result.data, i+1);</div><div class="code_line">&nbsp;&nbsp;if (Val[1] = &#39;-&#39;) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.flag := cardinal(i) or 000000</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.flag := cardinal(i);</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2424169</guid>
        <pubDate>Tue, 17 Nov 2009 21:13:13 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2424169</link>
        <description><![CDATA[Bug Hunter: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2423391'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Bug Hunter &#064; <time class="tag-quote__quoted-time" datetime="2009-11-16T20:48:43+00:00">16.11.09, 20:48</time></span><div class='quote '>Принцип понятен, попробую для сравнения реализовать чисто на Дельфи.</div></div><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">type</div><div class="code_line">&nbsp;&nbsp;THugeInt = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;data: array of longword;</div><div class="code_line">&nbsp;&nbsp; &nbsp;flag: longint;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">{Функция преобразования форматированой строки-10сс в массив-2^32сс}</div><div class="code_line">{ Функция ожидает строку, содержащую корректную запись целого числа, &nbsp;}</div><div class="code_line">{ форматированую в соответствии со спецификацией: строка должна &nbsp; &nbsp; &nbsp; }</div><div class="code_line">{ содержать только цифры и возможно знак &#39;+&#39;, &#39;-&#39; или один лидирующий }</div><div class="code_line">{ пробел вместо знака &#39;+&#39;. Для входящей строки, не соответствующей &nbsp; &nbsp;}</div><div class="code_line">{ спецификации, результат работы функции непредсказуем. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">Function StrToHugeInt(const s: string): THugeInt;</div><div class="code_line">&nbsp;&nbsp;Var</div><div class="code_line">&nbsp;&nbsp; &nbsp;i, rdlen, j, toend, k: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;a: int64;</div><div class="code_line">&nbsp;&nbsp; &nbsp;alw: array[0..1] of longword absolute a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;aa, inmind: longword;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.data:=nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;result.flag:=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (s[1] in [&#39;+&#39;,&#39;-&#39;,&#39; &#39;]) then i:=2 else i:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;toend:=length(s)-i+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;rdlen:=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (toend&#62;0) do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{йцукен фыва ячсми}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (toend&#62;=9) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;aa:=1000000000;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;k:=9;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;aa:=10; for k:=2 to toend do aa:=aa*10;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;k:=toend;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{умножаем result.data на aa}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inmind:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for j:=0 to rdlen-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a:=int64(result.data[j])*aa+inmind;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;result.data[j]:=alw[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;inmind:=alw[1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (inmind&#62;0) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;setlength(result.data, rdlen+1); inc(rdlen);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;result.data[rdlen-1]:=inmind;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{йцукен фыва ячсми}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;aa:=strtoint(copy(s, i, k));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{складываем result.data и aa}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inmind:=aa;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for j:=0 to rdlen-1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a:=int64(result.data[j])+inmind;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;result.data[j]:=alw[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;inmind:=alw[1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (inmind=0) then break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (inmind&#62;0) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;setlength(result.data, rdlen+1); inc(rdlen);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;result.data[rdlen-1]:=inmind;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{йцукен фыва ячсми}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;inc(i, k); dec(toend, k);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (toend=0) then break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (s[1]=&#39;-&#39;) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.flag:=-rdlen</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.flag:=rdlen;</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
Результат - 0.20 против 0.12 для функции от <strong class='tag-b'>sCreator</strong>, использующей модуль на asm.<br>
<br>
<strong class='tag-b'>sCreator</strong>, ++ за идею :yes:]]></description>
        <author>Bug Hunter</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2423391</guid>
        <pubDate>Mon, 16 Nov 2009 20:48:43 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2423391</link>
        <description><![CDATA[Bug Hunter: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2422026'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>sCreator &#064; <time class="tag-quote__quoted-time" datetime="2009-11-14T22:15:43+00:00">14.11.09, 22:15</time></span><div class='quote '>Функция Bug Hunter на моем компьютере дала в среднем 9,5 секунд.<br>
<br>
Мой интерфейсный объект ( немного доработанный вариант того что выкладывал ) <br>
перевел строку в цифровой массив за 95 миллисекунд</div></div><br>
На моем получилось 4.87 и 0.12 соответственно.<br>
<br>
Однако&#33; :yes: <br>
<br>
Принцип понятен, попробую для сравнения реализовать чисто на Дельфи.]]></description>
        <author>Bug Hunter</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2422026</guid>
        <pubDate>Sat, 14 Nov 2009 22:15:43 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2422026</link>
        <description><![CDATA[sCreator: По просьбе <strong class='tag-b'>Navi1982</strong> сообщаю результаты своего теста.<br>
При переводе строки из 48000 девяток:<br>
<br>
Функция <strong class='tag-b'>Bug Hunter</strong> на моем компьютере дала в среднем 9,5 секунд.<br>
<br>
Мой интерфейсный объект ( немного доработанный вариант того что выкладывал ) <br>
перевел строку в цифровой массив за 95 миллисекунд<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">unit BigInt;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TElemTyp = Cardinal;// word;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;IBigInt = interface</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Count: Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function IsNegative(): Boolean;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function ToHex(): String;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Compare(const Val: IBigInt):Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Invert():IBigInt;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function plus(const Val: IBigInt):IBigInt; overload;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function plus(const Val: TElemTyp):IBigInt; overload;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function minus(const Val: IBigInt):IBigInt; overload;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function minus(const Val: TElemTyp):IBigInt; overload;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function multiply(const Val: IBigInt):IBigInt; overload;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function multiply(const Val: TElemTyp):IBigInt; overload;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">function GetBigInt(const Val: Int64):IBigInt; overload;</div><div class="code_line">function GetBigInt(const Val: String):IBigInt; overload;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div></ol></div></div></div></div><br>
Вариант <strong class='tag-b'>Navi1982</strong> пробовать не стал.]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2421505</guid>
        <pubDate>Fri, 13 Nov 2009 21:35:45 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2421505</link>
        <description><![CDATA[Bug Hunter: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2420404'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-11-12T20:26:52+00:00">12.11.09, 20:26</time></span><div class='quote '>Странно... наверное я был не прав на счет FFFF... в конце перевода... Попробуйте перевести у себя число размером в 2000 9-ок (девяток) и результат скиньте сюда... Неужели правильно переводит?</div></div><br>
Все очень просто: (65535*10+9) mod 65536 = (65535*10+10-1) mod 65536 = <br>
= ((65535+1)*10-1) mod 65536 = ((65536)*10-1) mod 65536 = <br>
= ((65536)*9+65536-1) mod 65536 = ((65536)*9+65535) mod 65536 = <br>
= 65535<br>
<br>
Т.е. когда ты переводишь число из одних девяток, то в определенный момент получаешь в остатке &#036;FFFF и далее остатки всегда будут &#036;FFFF - это не ошибка, это это число действительно такое двоичное представление имеет.<br>
<br>
Переведи число из 2000 восьмерок - и ты увидишь разные значения в num.int до самого конца. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2009-11-13T21:45:38+00:00">13.11.09, 21:45</time></span></span><br>
Гы - для восьмерок получается периодическое повторение девяток слов :)]]></description>
        <author>Bug Hunter</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2420404</guid>
        <pubDate>Thu, 12 Nov 2009 20:26:52 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2420404</link>
        <description><![CDATA[Navi1982: Странно... наверное я был не прав на счет FFFF... в конце перевода... Попробуйте перевести у себя число размером в 2000 9-ок (девяток) и результат скиньте сюда... Неужели правильно переводит?<br>
<br>
Кстати, сравнил оба варианта перевода - свой и BugHunter&#39;а... результаты одинаковые, а вот по времени:<br>
исходное число 48000 по &#39;9&#39;<br>
<strong class='tag-b'>Моя</strong>: 122 <em class='tag-i'>секунды</em> :slow:<br>
против<br>
<strong class='tag-b'>BugHunter&#39;a</strong>: 3 <em class='tag-i'>секунды</em> :good: - молодчина&#33;&#33;&#33;<br>
или 100000 девяток за 15 секунд - я просто изумлён&#33;<br>
<br>
<strong class='tag-b'>BugHunter</strong>, снимаю шляпу&#33; Будишь в Кишиневе - обязательно пойдем тресним :beer:<br>
<br>
<em class='tag-i'>Дождусь еще ваших результатов тестирования и выложу код функции в первый пост с пометкой &quot;Вопрос решен&quot; :) </em>]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2420347</guid>
        <pubDate>Thu, 12 Nov 2009 18:45:36 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2420347</link>
        <description><![CDATA[Bug Hunter: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2420009'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-11-12T13:03:12+00:00">12.11.09, 13:03</time></span><div class='quote '>Но, исходя из уже проведенных тестов функции перевода, обнаружил, что компилятор не хранит массивы длинее 16Кбайт </div></div><br>
Че за бред? Даже Турбо Паскаль позволяет использовать структуры данных размером до 64k.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2420009'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-11-12T13:03:12+00:00">12.11.09, 13:03</time></span><div class='quote '>Давно еще, знал как это ограничение снимается, только не помню как? Подскажите, пожалуста. </div></div><br>
Ограничиние в 16k было для локальных (автоматических) массивов в Турбо Паскале при стандартных установках - лечилось увиличением размера сегмента стека, но память для динамического массива выделяется в куче и такого ограничения быть не должно &lt;_&lt; <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2420297'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-11-12T17:39:51+00:00">12.11.09, 17:39</time></span><div class='quote '>Что касается ошибок с памятью, то у меня не выдает ошибки, просто какбы получается память размером 16Кб забивается нормально, а все байты что свыше адресса 16Кб принимают значение FF. Непонятно почему?&#33;... </div></div><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">program Project4;</div><div class="code_line">&nbsp;</div><div class="code_line">{$APPTYPE CONSOLE}</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;SysUtils;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;a: array of integer;</div><div class="code_line">&nbsp;&nbsp;i: integer;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;setlength(a, 1000000);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for i:=0 to 1000000-1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp;a[i]:=i;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for i:=1000000-10 to 1000000-1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp;writeln(a[i]);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;finalize(a);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;readln;</div><div class="code_line">end.</div></ol></div></div></div></div><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">999990</div><div class="code_line">999991</div><div class="code_line">999992</div><div class="code_line">999993</div><div class="code_line">999994</div><div class="code_line">999995</div><div class="code_line">999996</div><div class="code_line">999997</div><div class="code_line">999998</div><div class="code_line">999999</div></ol></div></div></div></div><br>
Массивчик под 4 метра - и полет нормальный.<br>
<br>
Ты как свой массив смотришь то?]]></description>
        <author>Bug Hunter</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2420315</guid>
        <pubDate>Thu, 12 Nov 2009 18:04:01 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2420315</link>
        <description><![CDATA[Bug Hunter: А вот и мой вариант перевода через деление в столбик без использования делений и умножений:<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">type</div><div class="code_line">&nbsp;&nbsp;TBigNum = record &nbsp; &nbsp; &nbsp; &nbsp; // 2^31-1 = 2147483647 elements!!!</div><div class="code_line">&nbsp;&nbsp; &nbsp;flag: cardinal; &nbsp; &nbsp; &nbsp; &nbsp;// 31 - sign:0=+ 1=-, 0..30 - length of array</div><div class="code_line">&nbsp;&nbsp; &nbsp;int: array of word; &nbsp; &nbsp;//integer part of number</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">...</div><div class="code_line">&nbsp;</div><div class="code_line">{Функция преобразования форматированой строки-10сс в массив-2^16сс}</div><div class="code_line">{ Функция ожидает строку, содержащую корректную запись целого числа, &nbsp;}</div><div class="code_line">{ форматированую в соответствии со спецификацией: строка должна &nbsp; &nbsp; &nbsp; }</div><div class="code_line">{ содержать только цифры и возможно знак &#39;+&#39;, &#39;-&#39; или один лидирующий }</div><div class="code_line">{ пробел вместо знака &#39;+&#39;. Для входящей строки, не соответствующей &nbsp; &nbsp;}</div><div class="code_line">{ спецификации, результат работы функции непредсказуем. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">Function FStrToBigNum(const s: string): TBigNum;</div><div class="code_line">&nbsp;&nbsp;Var</div><div class="code_line">&nbsp;&nbsp; &nbsp;d: array of byte; dlen: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;i, j, k: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;a: longword; {accomulator}</div><div class="code_line">&nbsp;&nbsp; &nbsp;aw: array[0..1] of word absolute a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ab: array[0..3] of byte absolute a;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (s[1] in [&#39;+&#39;,&#39;-&#39;,&#39; &#39;]) then j:=2 else j:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dlen:=length(s)-(j-1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;setlength(d, dlen);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=0 to dlen-1 do d[i]:=ord(s[i+j])-ord(&#39;0&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;setlength(result.int, 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;k:=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while true do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;i:=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;a:=d[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;j:=1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;while (j&#60;dlen) do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a:=(((a shl 2) + a) shl 1)+d[j]; inc(j);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (ab[2]&#62;0) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;d[i]:=ab[2]; inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ab[2]:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (i&#62;0) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;d[i]:=0; inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.int[k]:=aw[0];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (i&#62;0) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dlen:=i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;setlength(result.int, k+2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;inc(k);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (s[1]=&#39;-&#39;) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.flag:=cardinal(k+1) or 000000</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;result.flag:=cardinal(k+1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;finalize(d);</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
Ловкость рук - и никакого мошенства&#33; &copy;]]></description>
        <author>Bug Hunter</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2420297</guid>
        <pubDate>Thu, 12 Nov 2009 17:39:51 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2420297</link>
        <description><![CDATA[Navi1982: <strong class='tag-b'>sCreator</strong>, еще не запускал программу... Что касается ошибок с памятью, то у меня не выдает ошибки, просто какбы получается память размером 16Кб забивается нормально, а все байты что свыше адресса 16Кб принимают значение FF. Непонятно почему?&#33;... Виновата в этом то ли опция в компиляторе, то ли это система WindowsXP 32bit не позволяет разбазаривать память...  :-?<br>
<br>
Касательно расположения байт, то при записи на диск они останутся в таком виде как записанны в массиве и считывание будет происходить также... Единственное что может помешать - это совместимость старых данных с новыми версиями программы. Так что на этот счет вы всеже правы, придется разворачивать массив и записывать число подрят. Чтобы можно было считать более новыми версиями где элемент массива будет например 32бита. Но при чтении нужно будет учесть кратность байт к элементам массива вот и все. :)]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2420163</guid>
        <pubDate>Thu, 12 Nov 2009 14:58:09 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2420163</link>
        <description><![CDATA[sCreator: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Незнаю... Почему-то мне кажется что при записи динамического массива на жесткий диск (несколько чисел подряд) я не смогу потом прочитать отдельное число (массив), т.к. не буду знать начала и длину считывания. Т.е. я покамись незнаю как в памяти хранится динамический массив.</div></div><br>
На диск записывать можно в любом придуманном формате - например записываете в 8 байт длину массива в байтах, а делее этот массив ( он в памяти непрерывно храниться ).<br>
обратно считываете 8 байт, устанавливаете длинну массива (выделяется память ) и считываете туда записанные данные (хранение в памяти и в файле разные вещи. Тем более, что в самой записи ( record )<br>
храняться только статические массивы, а на динамические только ссылки.<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>функция предназначена гарантировать содержание исключительно чисел в строке для упрщения функции перевода. </div></div><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">else</div><div class="code_line">&nbsp;&nbsp; &nbsp;if rem0=false then num:=num+&#39;0&#39;;</div></ol></div></div></div></div>На<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">else ;</div></ol></div></div></div></div><br>
А то случайно наберете в эдите пробел и у Вас появится лишний ноль ( во втором варианте он пропустится )<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>компилятор не хранит массивы длинее 16Кбайт</div></div><br>
В Delphi 7 похоже такой проблеммы нет ( попробовал SetLength(2000000) ошибки не дало.<br>
Переходите на семерку - с Апдейтами, по моему, самая стабильная - интерфейс ( насколько помню 6 ) практически идентичен.<br>
<br>
Удалось ли запустить мою наработку?<br>
<br>
Я там использовал для BigNum интерфейсы.<br>
Обьекты в Delphi необходимо отслеживать и уничтожать, во избежании утечек памяти, а при вычислениях формул постоянно создаются временные промежуточные результаты, что не проблема при простых типах данных.<br>
Интерфейсы же в месте с интерфейсными объектами сами следят за своим использованием и сами уничтожаются при обнулении ссылок.<br>
Для контроля утечек и подключал <strong class='tag-b'>FastMM4</strong> - бесплатная библиотека легко находится и скачивается из интернета. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2009-11-12T15:36:00+00:00">12.11.09, 15:36</time></span></span><br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Если в array хранить элементы в обратном порядке ( также как в word, например, сперва идет старший байт ), с выравнивание по 64 бита, то тогда через указатели можно получать к такому массиву доступ в каждом случае наиболее эффективный ( хоть UInt64, хоть word ).</div></div><br>
<br>
Прошу прощения, но кажется я ОШИБСЯ - сейчас проверил байты в <strong class='tag-b'>word </strong>храняться в прямом порядке.<br>
И это значит что при прямом порядке хранения элементов массива к ним через указатели можно обращатся по разному.  :blush:]]></description>
        <author>sCreator</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2420009</guid>
        <pubDate>Thu, 12 Nov 2009 13:03:12 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2420009</link>
        <description><![CDATA[Navi1982: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>sCreator</span><div class='quote '>TBigNum - зачем во флаге хранить длину array - всегда можно получить ее функцией Length().</div></div><br>
Незнаю... Почему-то мне кажется что при записи динамического массива на жесткий диск (несколько чисел подряд) я не смогу потом прочитать отдельное число (массив), т.к. не буду знать начала и длину считывания. Т.е. я покамись незнаю как в памяти хранится динамический массив.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>sCreator</span><div class='quote '>FormatStr - может символы отличные от цифр не переводить в нули ( даже не понял для чего это сделано ...</div></div><br>
Я не хотел заморачиватся нештатными ситуациями. Кроме того, функция предназначена гарантировать содержание исключительно чисел в строке для упрщения функции перевода. Ее все ровно придется переделывать, но позже. И вобще, функции перевода понадобятся лишь для тестов. Поэтому, если понадобится удобное чтение, то напишу другую функцию GroupNumStr которая просто вставит апострофы или пробелы в нужных местах.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>sCreator</span><div class='quote '>Если в array хранить элементы в обратном порядке ( также как в word, например, сперва идет старший байт )...</div></div><br>
Чесно говоря, я давно не помню как распологаются в памяти переменные. Ваша идея принята к сведению - Спасибо&#33;<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>sCreator</span><div class='quote '>Интересный вопрос - выделит ли система на один массив больше 2^31 БАЙТ и выделит ли на всю программу больше 2^32 БАЙТ на 32 битной архитектуре?</div></div><br>
Интересный вопрос, конечно... Но, исходя из уже проведенных тестов функции перевода, обнаружил, что компилятор не хранит массивы длинее 16Кбайт  :( Давно еще, знал как это ограничение снимается, только не помню как? Подскажите, пожалуста.  :blush: <br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>sCreator</span><div class='quote '>Немного о длинной арифметике ...<br>
...( ведь результат, как Вы говорили вполне приемлем, то есть укладывается в Int64? )</div></div><br>
Начну с ответа на вопрос из скобок... Максимальный результат не вместится в Int64 это однозначно и наверное даже в 128 бит - но его расчеты в процессе. Однако, он будет много меньше чем ранее указанное колличество знаков в промежуточном результате (134886 знаков в 10сс).<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>sCreator</span><div class='quote '>Не лучше ли разработать</div></div><br>
Нет - не лучше&#33; Нужны не примерные результаты, а точные.<br>
<br>
Люди, подскажите как воспользоватся регистрами XMM (128бит) из дельфи6 ?]]></description>
        <author>Navi1982</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2419778</guid>
        <pubDate>Thu, 12 Nov 2009 11:16:01 +0000</pubDate>
        <title>[Delphi] Длинная арифметика</title>
        <link>https://forum.sources.ru/index.php?showtopic=285453&amp;view=findpost&amp;p=2419778</link>
        <description><![CDATA[Bug Hunter: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=285453&view=findpost&p=2419462'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Navi1982 &#064; <time class="tag-quote__quoted-time" datetime="2009-11-12T00:22:01+00:00">12.11.09, 00:22</time></span><div class='quote '>Shaggy, а действительно - с какой версии? Я в 6-ой.</div></div><br>
Тип uint64 упоминается в 7-й версии как IDL тип, но он не работает: переменную типа uint64 описать можно, но арифметические выражения с ним даже не транслируются. И есть сведения, что в Delphi 2006 тип uint64 еще полноценно не работает. Так что используй мегацифры типа word и не парься.]]></description>
        <author>Bug Hunter</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	