На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (9) [1] 2 3 ...  8 9 все  ( Перейти к последнему сообщению )  
> [Delphi] Длинная арифметика , Давно уже пишется модуль... по кускам
    Люди, кто знает как работает алгоритм функции StrToInt ?

    Мне необходимо ее модифицировать так, чтобы она могла переваривать более длинные числа. Поможите разобратся, плииз. :help:

    Мне нужно перевести число записанное строкой -> в массив, как если бы это был один регистр, но не 32 бит, а стока скока будет иметь массив.

    Например, 1234567890 должно быть записанно в итоге как 49 96 02 D2... А теперь представьте что нужно перевести число 12345678901234567890123456789012345678901234567890 в такую же форму как и предыдущее.

    Прошу прощения, что изменил название темы. Но это название ей больше подходит!
    Старое название "Какой алгоритм у функции StrToInt ?, Надо его модифицировать для более длинных чисел..."
    Сообщение отредактировано: Navi1982 -
      Ну так он открыт в Delphi

      ExpandedWrap disabled
        procedure ConvertErrorFmt(ResString: PResStringRec; const Args: array of const); local;
        begin
          raise EConvertError.CreateResFmt(ResString, Args);
        end;
         
        function StrToInt(const S: string): Integer;
        var
          E: Integer;
        begin
          Val(S, Result, E);
          if E <> 0 then ConvertErrorFmt(@SInvalidInteger, [S]);
        end;
        Вот вариант StrToInt на асме (автор leo)
        ExpandedWrap disabled
          function MyStrToInt(S:pChar):cardinal;register;
          //eax = S
          asm
            xor edx,edx
            xor ecx,ecx
          @@loop:
            lea ecx,[ecx+ecx*4] //ecx:=ecx*5
            lea ecx,[edx+ecx*2] //ecx:=ecx*2+edx
            mov dl,[eax]
            inc eax
            sub dl,'0'
            jnc @@loop
            mov eax,ecx
          end;
          Цитата Navi1982 @
          более длинные числа

          int64 или числа, записанные строкой ?
            Тип TBCD рулит для более длинных чисел...
              В принцыпе я немного вопрос неправильно поставил... так-что наверное стоит переименовать тему...

              Для BCD чисел у меня свои алгоритмы имеются... Мне нужно перевести число записанное строкой -> в массив, как если бы это был один регистр, но не 32 бит, а стока скока будет иметь массив.

              Например, 1234567890 должно быть записанно в итоге как 49 96 02 D2... А теперь представьте что нужно перевести число 12345678901234567890123456789012345678901234567890 в такую же форму как и предыдущее.
              Сообщение отредактировано: Navi1982 -
                ООФ
                Navi1982 ждешь нового дефолта когда цены станут с множеством нулей и перестанут влазить в инт?

                дело конечно не мое но все же интересно, зачем?
                  Frees, пишу программку для проверки одной теории... сразу отмечу - это не связанно с вычислениями числа ПИ или других констант... Но программка пригодилась бы и для этих целей.

                  Если любопытно узнать подробности, то милости прошу в скайп navi1982
                    а как ты храниш свои длинные числа? динамичесский массив или просто область в памяти?

                    видел эту демку
                    ...Borland\BDS\4.0\Demos\DelphiWin32\VCLWin32\ComplexNumbers\Win32OperatorOverload.dpr
                      Поищи библиотеку FGInt, она решает эту и многие другие задачи
                        Цитата Lumen @
                        Вот вариант StrToInt на асме (автор leo)
                        ExpandedWrap disabled
                          function MyStrToInt(S:pChar):cardinal;register;
                          //eax = S
                          asm
                            xor edx,edx
                            xor ecx,ecx
                          @@loop:
                            lea ecx,[ecx+ecx*4] //ecx:=ecx*5
                            lea ecx,[edx+ecx*2] //ecx:=ecx*2+edx
                            mov dl,[eax]
                            inc eax
                            sub dl,'0'
                            jnc @@loop
                            mov eax,ecx
                          end;

                        на отрицательных числах не заработает.

                        ExpandedWrap disabled
                          function S2Int2(S: PChar): Integer;
                          asm
                                  xchg     edx, eax
                                  xor      eax, eax
                                  test     edx, edx
                                  jz       @@exit
                                  xor      ecx, ecx
                                  mov      cl, [edx]
                                  inc      edx
                                  cmp      cl, '-'
                                  pushfd
                                  je       @@0
                          @@1:    cmp      cl, '+'
                                  jne      @@2
                          @@0:    mov      cl, [edx]
                                  inc      edx
                          @@2:    SUB      cl, '0'
                                  cmp      cl, '9'-'0'
                                  ja       @@fin
                                  lea      eax, [eax+eax*4] //
                                  lea      eax, [ecx+eax*2] //
                                  jmp      @@0
                          @@fin:  popfd
                                  jne      @@exit
                                  neg      eax
                          @@exit:
                          end;
                          Frees, я собираюсь хранить конвертированное число в динамическом массиве array of cardinal; ... Хотя принцыпиальной разницы перевода не вижу в этом, ведь динамический массив можно расширять как только это понадобится. Но даже если приведешь пояснения для статического массива, то буду очень признателен! И кстати, что за демка? Откуда можно посмотреть?

                          Ins, я первый раз слышу о библиотеке FGInt... где искать то ?

                          Antonn, извини, но я не очень понял ассемблеровский код - расшифровать можешь? Т.е. на словах объясни что там делается?

                          спасибо
                            Цитата Navi1982 @
                            Ins, я первый раз слышу о библиотеке FGInt... где искать то ?


                            В гугле, вестимо :)
                              Navi1982 я прокоментировал лишь тот код, мой просто преобразует строку в integer
                                ОК... Спасибо всем!
                                INS, отдельное спасибо тебе за ссылку на FGInt... Хоть я ее (библиотеку) не заюзал, но пришел к выводу, что будет легче перевести строку-10базы в строку-2базы (как там), а потом порциями по 32 бита закинуть в нужный мне массив... Однако, такой метод не совсем рационален - есть огромное ограничение в длине такого числа, т.е. максимально возможное число будет зависеть от колличества символов вмещаемое в бинарную строку - это 2^32 символов, что даст максимум 134'217'728 байт для массива (т.е. 128 MB). Численно это 2^1'073'741'824 - что уже не плохо! Но все-же хочется достич максимального предела 2^(2^32) или хотябы 2^(2^31)... :rolleyes:

                                Хотя можно было бы задействовать и жесткий диск, но тогда результаты расчетов придется ждать годами. В принцыпе тех значений, что я привел выше, в полне достаточно для высокой степени точности расчетов в основной программе, но все-же хотелось бы достич предельно максимальных значений. Следовательно буду ждать других идей и предложений. :whistle:
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (9) [1] 2 3 ...  8 9 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0413 ]   [ 16 queries used ]   [ Generated: 28.04.24, 10:28 GMT ]