Число двойной длинны - не хватает слов!

Обсуждение программ nnCron и nnCron LITE

Число двойной длинны - не хватает слов!

Postby SaMM » Sun, 05 Nov 2006, 14:05

Приветствую Всех!

Почему нет слов для деления и умножения чисел двойной длинны ?
Или, может быть это можно сделать какими то другими путями ?
Например, как работать с числом 44294915678 если его надо
поделить на 1024 ?

44294915678 / 1024
SaMM
 
Posts: 236
Joined: Fri, 25 Aug 2006, 12:33

Postby makrus » Tue, 07 Nov 2006, 06:40

SaMM
Например, как работать с числом 44294915678 если его надо
поделить на 1024 ?

цитата из spf_help.zip (130k 20 Nov 2002) описание основных слов SP-Forth (на русском языке)
UM/MOD
Слово UM/MOD делит двойное число D(ux ux) на ux1, оставляя на стеке частное ux3 и остаток ux2.

( D(ux ux) ux1 -- ux2 ux3 )
Параметры
D(ux ux)
первое двойное число
ux1
второе число
Возвращемые значения
ux3
частное
ux2
остаток от деления
Заметки
Все значения и арифметика беззнаковые.

Исключительная ситуация возникает, если ux1 ноль или частное находится вне диапазона одинарных беззнаковых чисел.
все познается в сравнении
makrus
 
Posts: 336
Joined: Mon, 12 Jul 2004, 14:46
Location: Волгоград

Postby SaMM » Thu, 09 Nov 2006, 00:12

Спасибо за подсказку.

На этот раз, можно сказать прокатило.
А когда надо будет делить и умножать числа двойной длинны,
а в SP-Forth таких слов нет ...

Станно!
SaMM
 
Posts: 236
Joined: Fri, 25 Aug 2006, 12:33

Postby Kostya » Thu, 09 Nov 2006, 07:04

SaMM wrote:Спасибо за подсказку.

На этот раз, можно сказать прокатило.
А когда надо будет делить и умножать числа двойной длинны,
а в SP-Forth таких слов нет ...

Станно!


не знаю, как в nncrone, но в SPF в библиотеках они есть!
Например D* D/

P.S. При необходимости можно взять оттуда.
Kostya
 
Posts: 5
Joined: Tue, 31 Oct 2006, 13:31

Postby Kostya » Thu, 09 Nov 2006, 07:04

SaMM wrote:Спасибо за подсказку.

На этот раз, можно сказать прокатило.
А когда надо будет делить и умножать числа двойной длинны,
а в SP-Forth таких слов нет ...

Станно!


не знаю, как в nncrone, но в SPF в библиотеках они есть!
Например D* D/

P.S. При необходимости можно взять оттуда.
Kostya
 
Posts: 5
Joined: Tue, 31 Oct 2006, 13:31

Postby SaMM » Sat, 11 Nov 2006, 14:10

не знаю, как в nncrone, но в SPF в библиотеках они есть!
Например D* D/

В Кроне, такого похоже нет, т.к. на словах D* D/ выдает ошибку.

P.S. При необходимости можно взять оттуда.

Интересно, а как это правильно сделрть?
Может быть подскажете?
SaMM
 
Posts: 236
Joined: Fri, 25 Aug 2006, 12:33

Postby Lynx » Sat, 11 Nov 2006, 18:30

В spforth есть файлик BigMath, там есть функция
Code: Select all
\ DU/MOD Double Unsigned Division with Remainder.  Given an unsigned
\ 2-cell dividend and an unsigned 2-cell divisor,  return a 2-cell
\ remainder and a 2-cell quotient.  The algorithm is based on KnuthТs
\ algorithm in volume 2 of his Art of Computer Programming, simplified
\ for two-cell dividend and two-cell divisor.

Вроде бы то, что тебе надо. Может еще что-то есть - глубже не смотрел.
Берешь код этой функции и закидываешь в таб, чтобы можно было потом использовать.
User avatar
Lynx
 
Posts: 321
Joined: Thu, 04 May 2006, 20:07
Location: Уфа

Postby SaMM » Sun, 12 Nov 2006, 19:32

Lynx wrote:В spforth есть файлик BigMath, там есть функция


А где скачать эти исходники?
Нашел какой-то BigMath, а там из перечисленного только
DU/MOD есть.

Кстати (близко к теме)
Возможно пи из строки вытащить число двойной длинны
или в nnCron это тоже невозможно?
Вопрос обсуждается здесь.
http://nncron.ru/forums/viewtopic.php?t=1901
SaMM
 
Posts: 236
Joined: Fri, 25 Aug 2006, 12:33

Postby Lynx » Mon, 13 Nov 2006, 07:39

Как это ни странно, поищи SPForth :) Там будет.
User avatar
Lynx
 
Posts: 321
Joined: Thu, 04 May 2006, 20:07
Location: Уфа

Postby SaMM » Wed, 15 Nov 2006, 02:51

Lynx wrote:Как это ни странно, поищи SPForth :) Там будет.

Извени Lynx, я слепой, мне в 100 раз труднее что то найти, чем зрячиму. Подскажи, где скачать исходники SPForth ?
Если я не ошибаюсь, мне нужны именно они?

Кстати Lynx, прглашаю тебя высказаться в этой теме.
http://nncron.ru/forums/viewtopic.php?t=1901
SaMM
 
Posts: 236
Joined: Fri, 25 Aug 2006, 12:33

Postby AlikasS » Wed, 15 Nov 2006, 03:33

все здесь
http://spf.sourceforge.net/
SPF распространяется с исходными текстами.
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Postby SaMM » Wed, 15 Nov 2006, 14:46

Большое спасибо!
SaMM
 
Posts: 236
Joined: Fri, 25 Aug 2006, 12:33

Re: Число двойной длинны - не хватает слов!

Postby Morituruz » Fri, 14 Jun 2013, 15:20

Что-то я не смог найти в исходниках строку типа : D/ или : D*. Как там искать-то?
Интересует деление и умножение двойных чисел.
Last edited by Morituruz on Mon, 17 Jun 2013, 08:31, edited 1 time in total.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Число двойной длинны - не хватает слов!

Postby elos » Sat, 15 Jun 2013, 11:03

Для поиском FAR-ом по ALT-F7 обычно набираешь что-то типа"e D+" или "94 DOUBLE" в поле "Containing text" и находишь в итоге "CODE D+" в C:\nnDOC\source_418\spf_forthproc.f (например).Такие базовые слова обычно на встроенном ассемблере пишут. Прошвырнувшись по этому файлу внимательно, находишь соответственно D2*, D2/... Но рядом есть ещё S>D, U>D...

\devel\~pinka\lib\BigMath.f
лазим также по http://www.wilbaden.com/neil_bawd/
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Число двойной длинны - не хватает слов!

Postby Morituruz » Mon, 17 Jun 2013, 09:34

Ничего я там хорошего не нашёл.
Если б не гугл, совсем бы грустно было. Набор барахла для умножения и деления (DD* и DD/):
Code: Select all
\ умножение и деление чисел двойной длины:
: -ROT  ( a b c -- c a b ) ROT ROT ;

: D*    ( ud u -- ud ) \ bad name in PCF3.2, UDM* is better

            DUP ROT *   ( -- L n H*n )
            -ROT UM*    ( -- H*n dL*n )
            ROT +    ;  ( -- d )

: DD*   ( d1 d2 -- d3 )                     \ ZECH named it D*
        >R SWAP >R  ( -- 1L 2L ; R-- 2H 1H )
        2DUP UM*    ( -- 1L 2L d3" )
        ROT         ( -- 1L d3" 2L )
        R> *        ( -- 1L d3" 2L*1H ; R-- 2H )
        +           ( -- 1L d3' )
        ROT R>      ( -- d3' 1L 2H )
        * +     ;   ( -- d3 )

: UDM*/MOD  ( ud1 u2 u3 -- urem udquot ) \ 32b*16b/16b= 32bit
            >R DUP >R       ( -- ud1 u2 ; R-- u3 u2 )
            SWAP >R         ( -- u1L u2 ; R-- u3 u2 u1H )
            UM*   0 R> R>   ( -- ud 0 u1H u2 ; R-- u3 )
            UM*   D+        ( -- uL uM uH )
            R@              ( -- uL uM uH u3 )
            UM/MOD          ( -- uL R MH/u3=QH )
            R> SWAP >R      ( -- uL R u3 ; R-- QH )
            UM/MOD   R>  ;  ( -- R QL QH )

: UDM*/     ( ud1 u2 u3 -- udquot ) \ 32bit*16bit/16bit= 32bit
            UDM*/MOD  ROT DROP ;

: (udm/mod)     ( ud1 u2 -- udrem udquot )  \ REM =< 16bit !!!
    MU/MOD          ( -- uREM udQUOT )
    ROT 0   2SWAP ; ( -- udREM udQUOT ) \ rem fits in 16 bit

: (ud/mod)  ( ud1 ud2 -- udrem udquot ) \ QUOT =< 16bit !!!
    2DUP  >R >R  ( ud1 ud2 -- ud1 ud2 ; R-- ud2 )
    2OVER >R >R  ( -- ud1 ud2 ; R-- ud2 ud1 )
    DUP  1+      ( -- ud1 ud2 u2H+1 )
    0 1  ROT     ( -- ud1 ud2 1.0000h u2H+1 )
    UM/MOD NIP   ( -- ud1 ud2 uk=10000h/{u2H+1} )
    DUP >R       ( -- ud1 ud2 uk ; R-- ud2 ud1 uk )
    D*           ( -- ud1 uwL uwH )
    >R  >R       ( -- ud1 ; R-- ud2 ud1 uk uwH uwL )
    DUP 0 R> R@  ( -- ud1 u1H 0 uwL uwH ; R-- ud2 ud1 uk uwH )
    UDM*/        ( -- ud1 u1H*uwL/uwH )
    D-           ( -- ud1-u1H*uwL/uwH )

    ( -- ud1-u1h*uwL/uwh ; R-- ud2 ud1 uk uwh )
    R>  R>  SWAP ( -- ud1-u1h*uwL/uwh uk uwh )
    UDM*/        ( -- udQ )
    NIP          ( -- uQL )  \ uQ:xx -> uQ
    DUP          ( -- uQL uQL )
    R> R>        ( -- uQL uQL ud1 ; R-- ud2 )
    ROT          ( -- uQL ud1 uQL )
    R> R>        ( -- uQL ud1 uQL ud2 )
    ROT          ( -- uQL ud1 ud2 uQL )
    D*           ( -- uQL ud1 ud2*uQL )
    D-           ( -- uQL uRL uRh )
    ROT  0  ;    ( -- udrem udquot )    \ quot fits in 16 bit

: UD/MOD ( ud1 ud2 -- udrem udquot )
    ?DUP  IF  (ud/mod)  ELSE    (udm/mod)   THEN ;

: D/MOD ( d1 d2 -- drem dquot )
    2DUP >R >R                      ( R-- d2H d2L )
    DUP >R DABS   2SWAP DUP >R      ( R-- d2H d2L sign2 sign1 )
    DABS   2SWAP
    UD/MOD          ( ud1 ud2 -- udrem udquot )
    2OVER D0<> IF   \ remainder <>0 !!!
        R> R@  XOR  ( -- udrem udquot Squot ; R-- d2 sign2 )
        0< IF  NOT SWAP NOT SWAP THEN ( -- udrem dQfloored )
        2SWAP R> 0< IF  DNEGATE ( -drem ) THEN ( -- dQ drem )
        R> R> ( -- dQ dR d2 ) 2SWAP D- 2SWAP   ( -- d2--dR dQ )
    ELSE            \ remainder =0 !!!
        R> R> XOR R> R> 2DROP 0< IF DNEGATE THEN ( -- 0 0 dQ )
    THEN  ;

: DD/   ( d1 d2 -- dquot ) D/MOD    2SWAP 2DROP ;

User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests