Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб сен 22, 2018 23:33

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 44 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 20, 2008 15:36 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Вот еще один варинт. Имеет, пожалуй наилучшее распределение:
при n<248 - 1 байт
при n<2294 - 2 байта
при n<2^32 - 6 байт
Скачек с 2 до 6 байт при длине 2294 приемлем, поскольку счетчик составит 2294/6=382.(3) что меньше чем 1 байт в 255 байтной строке.
Код:
: SCNT! ( u addr --> # )
SWAP DUP 0x8F6 U> IF OVER 0xFFFF SWAP W! SWAP 2 + ! 6 EXIT THEN
DUP 0xF8 U< IF SWAP C! 1 EXIT THEN 0xF8 -
2DUP 0xF8 OR SWAP C!
3 RSHIFT SWAP 1+ C! 2
;

: SCNT@ ( addr --> u # )
DUP C@ DUP 0xF8 U< IF NIP 1 EXIT THEN 7 AND
OVER 1+ C@ 3 LSHIFT OR DUP 0x7FF = IF DROP 2+ @ 6 EXIT THEN
0xF8 + NIP 2
;

: SCOUNT ( '#str --> addr u ) DUP SCNT@ ROT + SWAP ;

: s", ( asc u --> ) DUP HERE SCNT! ALLOT HERE SWAP DUP ALLOT MOVE ;

_________________
Am I evil? I'm man - yes I am! © James Hatefield


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 20, 2008 15:39 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2120
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
mOleg писал(а):
к чему конкретно этот вопрос?

К тому, что нет ли необходимости кодировать в первом байте еще и основные типы данных:
слово, строка, число, бинарный массив и т.д. чтобы в дальнейшем знать как с ними работать.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 20, 2008 15:55 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4949
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
chess писал(а):
к чему конкретно этот вопрос?

К тому, что нет ли необходимости кодировать в первом байте еще и основные типы данных:
слово, строка, число, бинарный массив и т.д. чтобы в дальнейшем знать как с ними работать.


Это независимая вещь, смысла лично я невижу в хранении доп.информации в счетчике.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 20, 2008 16:08 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4949
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
вот один из моих вариантов (первый)
в нем длина числа определяется младшими битами первого числа:
1 байт - если младший бит = '0'
2 байта - если младший бит равен '1' а следующий за ним бит = '0'
3 байта - если два младших бита = '1' и дальше '0'
4 байта - три младшие бита = '1' и дальше 0
то есть:
1 байт = XXXXXXX0
2 байта = XXXXXXXX XXXXXX01
3 байта = XXXXXXXX XXXXXXXX XXXXX011
4 байта = XXXXXXXX XXXXXXXX XXXXXXXX XXXX01111

Код:
\ 2008-03-20 ~mOleg
\ Сopyright [C] 2008 mOleg mininoleg@yahoo.com
\ поддержка длинных строк

REQUIRE ?DEFINED devel\~moleg\lib\util\ifdef.f
REQUIRE SWITCH:  devel\~moleg\lib\util\switch.f
S" devel\~mOleg\lib\util\bytes.f" INCLUDED

\ распаковка значения числа однобайтовой длины
: 1x7F ( u --> u ) 1 RSHIFT 0x7F AND 1 ;
\ .. двухбайтовой длины
: 2x3FFF ( u --> u ) 2 RSHIFT 0x3FFF AND 2 ;
\ .. трехбайтовой длины
: 3x1FFFFF ( u --> u ) 3 RSHIFT 0x1FFFFF AND 3 ;
\ .. четырехбайтовой длины
: 4xFFFFFFF ( u--> u ) 4 RSHIFT 0xFFFFFFF AND 4 ;

\ вернуть значение u, хранимое по адресу Addr и длину поля данных
: SCNT@ ( addr --> u # )
        @ DUP 7 AND
        SWITCH: NOOP
                1x7F 2x3FFF  1x7F 3x1FFFFF  1x7F 2x3FFF  1x7F 4xFFFFFFF
        ;SWITCH ;

\ сохранить занчение u в память по адресу addr,
\ вернуть кол-во байт, отведенных под хранение числа
: SCNT! ( u addr --> # )
        OVER 0x1FFFFF U> IF SWAP 4 LSHIFT 7 OR SWAP ! 4 EXIT THEN
        OVER 0x3FFF > IF SWAP 3 LSHIFT 3 OR SWAP ! 3 EXIT THEN
        OVER 0x7F > IF SWAP 2 LSHIFT 1 OR SWAP W! 2 EXIT THEN
        SWAP 1 LSHIFT SWAP B! 1 ;

\ вернуть адрес начала и длину поля (строки)
: COUNT ( addr --> addr u ) DUP SCNT@ ROT + SWAP ;

\ компилировать число на вершину кодофайла
: SCNT, ( u --> ) HERE SCNT! ALLOT ;

\ компилировать строку со счетчиком на вершину кодофайла
: S", ( asc # --> ) DUP SCNT, S, ;

\ выложить адрес и начало строки, лежащей в коде за SLITERAL
: (SLITERAL) ( --> asc # )
             R> COUNT 2DUP + 1 + >R ;

\ Скомпилировать литеральную строку, заданную asc # в текущее определение
: SLIT, ( asc # --> ) COMPILE (SLITERAL) S", 0 B, ;

?DEFINED test{ \EOF -- тестовая секция ---------------------------------------

test{ CREATE zzz 0 ,
      0x7F zzz SCNT! 1 <> THROW  zzz SCNT@ 1 <> THROW 0x7F <> THROW
      0x3FFF zzz SCNT! 2 <> THROW  zzz SCNT@ 2 <> THROW 0x3FFF <> THROW
      0x1FFFFF zzz SCNT! 3 <> THROW  zzz SCNT@ 3 <> THROW 0x1FFFFF <> THROW
      0xFFFFFFF zzz SCNT! 4 <> THROW  zzz SCNT@ 4 <> THROW 0xFFFFFFF <> THROW
      zzz DUP COUNT 0xFFFFFFF <> THROW CELL - <> THROW
  S" passed" TYPE
}test

\EOF
сейчас достаточно часто появляется необходимость хранить строки длиной более
255 символов, при этом, как обычно, достаточно много бывает коротких строковых
литералов, на которых не хотелось бы лишние байты тратить.
Конечно же, можно сделать счетчик строк длиной в 4 байта... Но хочется более
изящного решения...
В данной библиотечке длина счетчика строки может составлять 1,2,3,4 байта - в
зависимости от длины строки: 127\16383\2097151\268435455.
Предельная длина строки 2^28-1 = 268435455.


_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 20, 2008 22:19 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Пока сидел на рундуке, после работы, пришел к интуитивному выводу, что лучше индикатор количества байтов в счетчике держать в младших битах первого байта.

Про оптимальность ничего утверждать не буду.

Код:
\ 00 - 6 бит - счетчик
\ 01 - 14 бит счетчик
\ 10 - 22 бит счетчик
\ 11 - 30 бит счетчик

\ преобразует 4-хбайтное число в "счетчик" с указанием байтности
: n>CNT ( n -- n' #) 2* 2* \ при n > C0000000 - полезут глюки
DUP 3F000000 AND IF  ( 4 байта на счетчик ) 3 + 4 EXIT THEN
DUP 3FFF0000 AND IF  ( 3 байта ) 2 + 3 EXIT THEN
DUP 3FFFFF00 AND IF  ( 2 байтa ) 1 + 2 EXIT THEN
( 1 байт ) FF AND 1 ;

\ преобразует обратно "счетчик" в нормальное число
: CNT>n ( n' -- n)
DUP 3 AND IF ( 1 байт ) 2/ 2/ FF AND EXIT THEN
DUP 3 AND 1 = IF ( 2 байта) 2/ 2/ 3FFF AND EXIT THEN
DUP 3 AND 2 = IF ( 3 байта) 2/ 2/ 3FFFFF AND EXIT THEN
( 4 байта ) 2/ 2/ 3FFFFFFF AND ;

\ сохранить счетчик длины строки u в памяти по адресу addr
\ вернуть длину # байт, занятых под счетчик строки
: SCNT! ( u addr --> # ) OVER CNT>n SWAP ROT !  ;

\ прочесть счетчик длины строки u из памяти по адресу addr,
\ длину счетчика строки в байтах.
: SCNT@ ( addr --> u # ) @ CNT>n DUP n>CNT NIP ; \ об оптимальности речи нет, ясен пень

\ два оставшихся слова из задания не сделал, т.к. не понял, что у них на входе...


Ничего не проверял, потому что всю ночь не ел, весь день не спал, и ясное дело - устал!

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 20, 2008 22:51 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
\ 00 - 6 бит - счетчик
Мне кажется что 2 байта на счетчик 65 байтной строки малость расточительно. Но это кому как. :roll:

_________________
Am I evil? I'm man - yes I am! © James Hatefield


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 20, 2008 22:58 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
: SCNT! ( u addr --> # ) OVER CNT>n SWAP ROT !  ;
Так делать, в общем случае нельзя. Откуда уверенность что можно писать все 4 байта в любом случае?
WingLion писал(а):
: SCNT@ ( addr --> u # ) @ CNT>n DUP n>CNT NIP ; \ об оптимальности речи нет, ясен пень
Аналогично, читать вслепую 4 байта опасно, поскольку, теоретически может быть AV.

_________________
Am I evil? I'm man - yes I am! © James Hatefield


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт мар 21, 2008 00:09 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Forthware писал(а):
Мне кажется что 2 байта на счетчик 65 байтной строки малость расточительно. Но это кому как.


Речь была о двух битах, а не байтах

WingLion писал(а):
индикатор количества байтов в счетчике держать в младших битах первого байта.


п.с. а про непроверенность предложенного кода - я предупреждал

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт мар 21, 2008 00:16 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
Речь была о двух битах, а не байтах
Вы не поняли. Если в первом байте 2 бита флаги, то максимальная длина строки со счетчиком 1 байт всего 63 символа, поскольку только 6 бит используются как счетчик. Так что длина строки 65 байт в вашем варианте будет задана 2 байтами: 0x0105
WingLion писал(а):
п.с. а про непроверенность предложенного кода - я предупреждал
Я вкурсе. :) Как минимум CNT>n не работает. ;)

_________________
Am I evil? I'm man - yes I am! © James Hatefield


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт мар 21, 2008 01:35 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Афигенная расточительность! Код строки разЖИРееет на целых 1.6%!

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт мар 21, 2008 11:01 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
Афигенная расточительность! Код строки разЖИРееет на целых 1.6%!
Я ж сказал - кому как. Лично я не против вообще все строки всегда сохранять с 4 байтным счетчиком. Но у автора задачи другие соображения. Пусть он и реашет. :)
Автор задачи писал:
mOleg писал(а):
С другой стороны, если речь иде о unicode строках, то запросто можно попасть на ситуацию, когда длина строки 255-1024 байта...
поэтому такая большая ступенька "вроде как" не очень удачна.
Под ступенькой подразумевалось переход од 1 до 4 байта при длине строки начиная с 255 символов. При этом, "разжирение" составляло не более: 3*100/255~=1.18. То есть, не более 1.18% что меньше чем 1.6% в вашем случае.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб мар 22, 2008 19:44 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4949
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
и вот мой последний вариант реализации счетчика строк:
Код:
\ 2008-03-21 ~mOleg
\ Сopyright [C] 2008 mOleg mininoleg@yahoo.com
\ хранение строк со счетчиком переменной длины

REQUIRE ?DEFINED devel\~moleg\lib\util\ifdef.f
REQUIRE SWITCH:  devel\~moleg\lib\util\switch.f
S" devel\~mOleg\lib\util\bytes.f" INCLUDED

\ методы извлечения числа
: 1byte ( n --> u # ) 1 RSHIFT 0x7F AND 1 ;
: 2byte ( n --> u # ) 2 RSHIFT 0x3FFF AND 2 ;
: 4byte ( n --> u # ) 2 RSHIFT 4 ;

\ извлечь упакованное число u из памяти по адресу addr
\ вернуть количество байт в числе
: X@ ( addr --> u # )
     @ DUP 3 AND SWITCH: NOOP 1byte 2byte 1byte 4byte ;SWITCH ;

\ сохранить упакованное число u в память по адресу addr
\ вернуть количество байт в числе
: X! ( u addr --> # )
     >R 0x80 OVER U> IF 1 LSHIFT R> B! 1 EXIT THEN
        0x4000 OVER U> IF 2 LSHIFT 1 OR R> W! 2 EXIT THEN
        2 LSHIFT 3 OR R> ! 4 ;

\ вернуть адрес начала и длину поля (строки)
: COUNT ( addr --> addr u ) DUP X@ ROT + SWAP ;

\ компилировать число на вершину кодофайла
: X, ( u --> ) HERE X! ALLOT ;

\ компилировать строку со счетчиком на вершину кодофайла
: S", ( asc # --> ) DUP X, S, ;

\ выложить адрес и начало строки, лежащей в коде за SLITERAL
: (SLITERAL) ( r: addr --> asc # ) R> COUNT 2DUP + 1 + >R ;

\ Скомпилировать литеральную строку, заданную asc # в текущее определение
: SLIT, ( asc # --> ) COMPILE (SLITERAL) S", 0 B, ;

?DEFINED test{ \EOF -- тестовая секция ---------------------------------------

test{ CREATE zzz 0 ,
      0x7F zzz X! 1 <> THROW  zzz X@ 1 <> THROW 0x7F <> THROW
      0x3FFF zzz X! 2 <> THROW  zzz X@ 2 <> THROW 0x3FFF <> THROW
      0x1FFFFF zzz X! 4 <> THROW  zzz X@ 4 <> THROW 0x1FFFFF <> THROW
      0xFFFFFFF zzz X! 4 <> THROW  zzz X@ 4 <> THROW 0xFFFFFFF <> THROW
      zzz DUP COUNT 0xFFFFFFF <> THROW CELL - <> THROW
  S" passed" TYPE
}test


_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб мар 22, 2008 21:41 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4949
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
да, кстати вот ассемблерные варианты чтения и записи счетчика символов:
Код:
CODE X@ ( addr --> u # )
        MOV EAX , [EAX]
        TEST EAX , # 1
        JZ @@1 \ переход, если число упаковано в байт
        TEST EAX , # 2
        JZ @@2 \ переход, если число упаковано в два байта
        SHR EAX , # 2 \ иначе 4-х байтное число
        dpush EAX
        MOV EAX , # 4
       RET
   @@1: SHR EAX , # 1
        AND EAX , # 0x7F
        dpush EAX
        MOV EAX , # 1
       RET
   @@2: SHR EAX , # 2
        AND EAX , # 0x3FFF
        dpush EAX
        MOV EAX , # 2
       RET
   END-CODE

CODE X! ( u addr --> # )
        dpop temp
        TEST temp , # 0xFFFFC000
       JNZ @@1
        TEST temp , # 0x3F80
       JNZ @@2
        SHL temp , # 1
        MOV [tos] , temp-byte
        MOV tos , # 1
      RET
   @@2: SHL temp , # 2
        OR temp , # 1
        MOV [tos] , temp-word
        MOV tos , # 2
      RET
   @@1: SHL temp , # 2
        OR temp , # 3
        MOV [tos] , temp
        MOV tos , # 4
      RET
   END-CODE

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 27, 2008 15:11 
Не в сети
Аватара пользователя

Зарегистрирован: Вт ноя 06, 2007 21:23
Сообщения: 227
Откуда: Екатеринбург
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
Педлагаю немного переделать мой код на то что вы хотите
Конечно я не знаю в SPF синтаксиса языка для ООП, вот мне приходилось со степенными полиномами работать, может этот код подскажет вам идею. Жду комментариев.
реализация для SwiftForth
Код:
DECIMAL
: RIGHT-INPUT  ( n1 - c-addr n2 )  PAD TUCK SWAP  2DUP BLANK  ACCEPT ;
: RIGHT-INT-INPUT? ( - flag )  12 RIGHT-INPUT NUMBER? DUP 2 = IF 2DROP THEN 1 = ;

{ -------------------------------------------------------------------
   Prototype class
-------------------------------------------------------------------- }
CLASS _POLYNOM
PRIVATE
   VARIABLE POINTER \ Address for coefficient table
   VARIABLE POWER \ Polynomial power
PROTECTED
   DEFER: ELEMENTS ; \ multiply by coefficent memory-size
   DEFER: COEFF-INPUT? ; \ coefficient input function
   DEFER: @COEFF ;   DEFER: !COEFF ;
   ( zero-compare) DEFER: 0COMP ;   ( print coefficient) DEFER: DOT ;
   : !POWER ( u - )  POWER ! ;   : !POINTER ( addr - )  POINTER ! ;
PUBLIC
   : @POWER ( - u )  POWER @ ;   : @POINTER ( - addr )  POINTER @ ;
   : @AT ( u - a@u )  ELEMENTS POINTER @ + @COEFF ;
   : !AT ( a@u u - )  ELEMENTS POINTER @ + !COEFF ;   DEFER: ~!AT  SWAP !AT ;
   : DELETE ( - )  POINTER @ FREE THROW  0 POINTER ! -1 POWER ! ;
   : CREATE ( u - )  DUP 1+ ELEMENTS ALLOCATE THROW POINTER ! POWER ! ;
END-CLASS

{ -------------------------------------------------------------------
   Utility functions
-------------------------------------------------------------------- }
_POLYNOM SUBCLASS POLYNOM
PRIVATE
   : POWER? ( - u )  BEGIN  CR ." POWER?="  RIGHT-INT-INPUT? UNTIL ;
   : COEFF? ( u - a@n )  BEGIN  CR ." A["  1 U.R ." ]?="  COEFF-INPUT? UNTIL ;
   : (COPY) [OBJECTS  _POLYNOM NAMES POLY  OBJECTS]
      POLY @POINTER  ( self) @POINTER   POLY @POWER  1+ ( self) ELEMENTS  MOVE ;
   : ?REDUCE ( - n)  @POWER 0 BEGIN  2DUP >  OVER @AT 0COMP  AND WHILE 1+ REPEAT NIP ;
PUBLIC
   : REDUCE ( - )  ?REDUCE ?DUP IF  DUP @POWER SWAP - !POWER
         ELEMENTS @POINTER +  @POINTER  @POWER 1+ ELEMENTS CMOVE  THEN ;
   : EXPAND ( u - )  DUP @POWER > IF  DUP @POWER - ELEMENTS >R
       @POINTER  OVER 1+ ELEMENTS RESIZE THROW  DUP !POINTER
       DUP R@ +  @POWER 1+ ELEMENTS CMOVE>  @POINTER R> ERASE  THEN  !POWER ;
   : BUILD ( a@n a@n-1 ... a@0 u - )  DELETE CREATE  @POWER 1+ 0 ?DO I !AT LOOP ;
   : COPY [OBJECTS  _POLYNOM NAMES POLY  OBJECTS]
       ( self) DELETE  POLY @POWER  ( self) CREATE  POLY ADDR ( self) (COPY) ;
   : REDUCECOPY [OBJECTS  _POLYNOM NAMES POLY  OBJECTS]
      POLY ADDR ( self) COPY  ( self) REDUCE ;
   : EXPANDCOPY ( n - ) [OBJECTS  _POLYNOM NAMES POLY  OBJECTS]
      POLY ADDR ( self) COPY  ( self) EXPAND ;
   : SHOW ( - )
      CR @POINTER IF  ." POWER: " @POWER DUP .  ." COEFF: " 1+ 0 ?DO I @AT DOT LOOP
      ELSE ." Not initialized" THEN CR ;
   : INPUT ( - )  CR ." Please enter polynomial power and coefficients" POWER? DELETE
      CREATE  @POWER 1+ 0 ?DO I DUP COEFF?  ~!AT LOOP  REDUCE ;
END-CLASS

{ -------------------------------------------------------------------
   Polynomials with INTEGER coefficients
------------------------------------------------------------------- }
PUBLIC
POLYNOM SUBCLASS POLYNOM_INT \ polynomials with integer coefficient
PROTECTED
   : ELEMENTS  CELLS ;   : !COEFF  ! ;   : @COEFF  @ ;
   : 0COMP  0= ;    : DOT  . ;   : COEFF-INPUT?  RIGHT-INT-INPUT? ;
END-CLASS


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 27, 2008 17:00 
Не в сети

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Alexander писал(а):
Педлагаю немного переделать мой код на то что вы хотите
Каким образом? :?
Alexander писал(а):
вот мне приходилось со степенными полиномами работать, может этот код подскажет вам идею. Жду комментариев.
Идеи не вижу. У вас степень (количество коэффициентов) представленно всегда 4 байтами. Связи между всем остальным и поставленной задачей я не вижу. Если она есть - укажите пожалуйста. Буду признателен. :)

_________________
Am I evil? I'm man - yes I am! © James Hatefield


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 44 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB