Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.109.30] |
|
Страницы: (9) [1] 2 3 ... 8 9 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Люди, кто знает как работает алгоритм функции StrToInt ?
Мне необходимо ее модифицировать так, чтобы она могла переваривать более длинные числа. Поможите разобратся, плииз. Мне нужно перевести число записанное строкой -> в массив, как если бы это был один регистр, но не 32 бит, а стока скока будет иметь массив. Например, 1234567890 должно быть записанно в итоге как 49 96 02 D2... А теперь представьте что нужно перевести число 12345678901234567890123456789012345678901234567890 в такую же форму как и предыдущее. Прошу прощения, что изменил название темы. Но это название ей больше подходит! Старое название "Какой алгоритм у функции StrToInt ?, Надо его модифицировать для более длинных чисел..." |
Сообщ.
#2
,
|
|
|
Ну так он открыт в Delphi
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; |
Сообщ.
#3
,
|
|
|
Вот вариант StrToInt на асме (автор leo)
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; |
Сообщ.
#4
,
|
|
|
Цитата Navi1982 @ более длинные числа int64 или числа, записанные строкой ? |
Сообщ.
#5
,
|
|
|
Тип TBCD рулит для более длинных чисел...
|
Сообщ.
#6
,
|
|
|
В принцыпе я немного вопрос неправильно поставил... так-что наверное стоит переименовать тему...
Для BCD чисел у меня свои алгоритмы имеются... Мне нужно перевести число записанное строкой -> в массив, как если бы это был один регистр, но не 32 бит, а стока скока будет иметь массив. Например, 1234567890 должно быть записанно в итоге как 49 96 02 D2... А теперь представьте что нужно перевести число 12345678901234567890123456789012345678901234567890 в такую же форму как и предыдущее. |
Сообщ.
#7
,
|
|
|
ООФ
Navi1982 ждешь нового дефолта когда цены станут с множеством нулей и перестанут влазить в инт? дело конечно не мое но все же интересно, зачем? |
Сообщ.
#8
,
|
|
|
Frees, пишу программку для проверки одной теории... сразу отмечу - это не связанно с вычислениями числа ПИ или других констант... Но программка пригодилась бы и для этих целей.
Если любопытно узнать подробности, то милости прошу в скайп navi1982 |
Сообщ.
#9
,
|
|
|
а как ты храниш свои длинные числа? динамичесский массив или просто область в памяти?
видел эту демку ...Borland\BDS\4.0\Demos\DelphiWin32\VCLWin32\ComplexNumbers\Win32OperatorOverload.dpr |
Сообщ.
#10
,
|
|
|
Поищи библиотеку FGInt, она решает эту и многие другие задачи
|
Сообщ.
#11
,
|
|
|
Цитата Lumen @ Вот вариант StrToInt на асме (автор leo) 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; на отрицательных числах не заработает. 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; |
Сообщ.
#12
,
|
|
|
Frees, я собираюсь хранить конвертированное число в динамическом массиве array of cardinal; ... Хотя принцыпиальной разницы перевода не вижу в этом, ведь динамический массив можно расширять как только это понадобится. Но даже если приведешь пояснения для статического массива, то буду очень признателен! И кстати, что за демка? Откуда можно посмотреть?
Ins, я первый раз слышу о библиотеке FGInt... где искать то ? Antonn, извини, но я не очень понял ассемблеровский код - расшифровать можешь? Т.е. на словах объясни что там делается? спасибо |
Сообщ.
#13
,
|
|
|
Цитата Navi1982 @ Ins, я первый раз слышу о библиотеке FGInt... где искать то ? В гугле, вестимо |
Сообщ.
#14
,
|
|
|
Navi1982 я прокоментировал лишь тот код, мой просто преобразует строку в integer
|
Сообщ.
#15
,
|
|
|
ОК... Спасибо всем!
INS, отдельное спасибо тебе за ссылку на FGInt... Хоть я ее (библиотеку) не заюзал, но пришел к выводу, что будет легче перевести строку-10базы в строку-2базы (как там), а потом порциями по 32 бита закинуть в нужный мне массив... Однако, такой метод не совсем рационален - есть огромное ограничение в длине такого числа, т.е. максимально возможное число будет зависеть от колличества символов вмещаемое в бинарную строку - это 2^32 символов, что даст максимум 134'217'728 байт для массива (т.е. 128 MB). Численно это 2^1'073'741'824 - что уже не плохо! Но все-же хочется достич максимального предела 2^(2^32) или хотябы 2^(2^31)... Хотя можно было бы задействовать и жесткий диск, но тогда результаты расчетов придется ждать годами. В принцыпе тех значений, что я привел выше, в полне достаточно для высокой степени точности расчетов в основной программе, но все-же хотелось бы достич предельно максимальных значений. Следовательно буду ждать других идей и предложений. |