IPB
ЛогинПароль:

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> операции над сист счисления
AlexSt
сообщение 21.12.2007 12:32
Сообщение #21


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской
Реальное имя: Алексей

Репутация: -  0  +


ого!, здо'рово! попытаюсь разобраться, вот хотел ещё узнать при конвертации если количество знаков в дробной части увеличивается часть из них может перейти в целую часть числа? зависит ли положение запятой от того в большую сс переводишь число или в меньшую? я кстати сделал уголок, но вот запятая всё косячит norespect.gif
не знаю пока, если пойму возьмусь за твою идею)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 23.12.2007 3:16
Сообщение #22


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(AlexSt @ 21.12.2007 12:32) *

хотел ещё узнать при конвертации если количество знаков в дробной части увеличивается часть из них может перейти в целую часть числа?

Дробная часть меньше единицы, целая - больше. Они живут отдельно, независимо. Нет, знаки не могут "переходить".

Я тут на досуге накорябал все четыре действия над вещественными числами smile.gif. Любая длина (до 32К), любое основание (до 32К), со знаками. Теперь сделать конвертацию займет не более 15 минут.. Если хочешь - могу показать.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 23.12.2007 12:13
Сообщение #23


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Цитата(Lapp @ 23.12.2007 3:16) *

Дробная часть меньше единицы, целая - больше. Они живут отдельно, независимо. Нет, знаки не могут "переходить".

Я тут на досуге накорябал все четыре действия над вещественными числами smile.gif. Любая длина (до 32К), любое основание (до 32К), со знаками. Теперь сделать конвертацию займет не более 15 минут.. Если хочешь - могу показать.

1. Что знечит "любое основание"? Или числа хранятся в виде текста?
2. 15 минут на конвертацию числа - это сильно даже для IBM PC с ее 4.77. МГц. smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 23.12.2007 15:40
Сообщение #24


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(andriano @ 23.12.2007 12:13) *
1. Что знечит "любое основание"? Или числа хранятся в виде текста?
andriano, если вступаешь в разговор не в его начале - будь добр, потрудись прочесть предыдущие мессаджи..

Цитата(andriano @ 23.12.2007 12:13) *
2. 15 минут на конвертацию числа - это сильно даже для IBM PC с ее 4.77. МГц. smile.gif
Неудачная шутка - я делал такие вещи еще на Apple-2 (2 МГц, 8 бит) весьма успешно и достаточно быстро smile.gif.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AlexSt
сообщение 25.12.2007 8:39
Сообщение #25


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской
Реальное имя: Алексей

Репутация: -  0  +


lapp, если не трудно, выложи good.gif
я вот конвертацию уже рабочую слепил, умножение, деление через конвертацию, осталось подумать над сложжением и вычитанием толковым, но выкладывай всё - интересно!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 25.12.2007 15:58
Сообщение #26


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Выкладываю.
Предупреждаю:
1. решение не оптимизировано;
2. могут быть ошибки;
3. все действия должны выполняться над числами в одной СС (автоматического контроля за этим нету).
const
L=6;

type
tNum= record
m: array[1..L]of integer;
e,b: integer;
n: boolean;
end;

const
{младшие разряды слева, точка сдвинута на величину e от правого края}
a: tNum= (m:(0,2,1,1,0,0); e:3; b:10; n:false); {это 1.12}
b: tNum= (m:(0,6,5,0,0,0); e:1; b:10; n:true); {это -0.0056}
nill: tNum= (m:(0,0,0,0,0,0); e:0; b:10; n:false); {это 0}

var
c: tNum;

{ Number output }
procedure WrNum(a:tNum);
var
i,k:integer;
begin
with a do begin
if n then Write('-.') else Write(' .');
for i:=L downto 1 do begin
if m[i]<10 then k:=48 else k:=55;
Write(Chr(m[i]+k))
end;
Write('_e',e,'_b',b)
end
end;

procedure Norm(var a:tNum; s:integer);
var
i,j,k:integer;
begin
k:=0;
with a do begin
while (k<L)and(m[L-k]=0) do Inc(k);
if k=L then e:=0
else begin
Dec(k,s);
if k>0 then for i:=L-s downto 1 do begin
j:=i-k;
if j>0 then m[i]:=m[j] else m[i]:=0
end
else if k<0 then for i:=1 to L do begin
j:=i-k;
if j<=L then m[i]:=m[j] else m[i]:=0
end;
Dec(e,k)
end
end
end;

{ Addition, no sign }
procedure Ad(a,b:tNum; var c:tNum);
var
i,d:integer;
begin
Norm(a,1);
Norm(b,1);
if a.m[L-1]=0 then c:=b
else if b.m[L-1]=0 then c:=a
else begin
if a.e>b.e then Norm(b,a.e-b.e+1) else Norm(a,b.e-a.e+1);
d:=0;
for i:=1 to L-1 do begin
d:=a.m[i]+b.m[i]+d;
c.m[i]:=d mod a.b;
d:=d div a.b
end;
c.e:=a.e;
c.b:=a.b
end
end;

{ Substruction, no sign }
procedure Sb(a,b:tNum; var c:tNum);
var
i,d: integer;
f: boolean;
begin
Norm(a,0);
Norm(b,0);
if a.m[L]=0 then begin
c:=b;
c.n:=not b.n
end
else if b.m[L]=0 then begin
c:=a;
c.n:=not a.n
end
else begin
if a.e>b.e then Norm(b,a.e-b.e) else Norm(a,b.e-a.e);
d:=0;
i:=L;
while (i>1)and(a.m[i]=b.m[i]) do Dec(i);
f:=a.m[i]<b.m[i];
for i:=1 to L do begin
if f then d:=b.m[i]-a.m[i]+d+a.b else d:=a.m[i]-b.m[i]+d+a.b;
c.m[i]:=d mod a.b;
d:=d div a.b-1
end;
c.e:=a.e;
c.b:=a.b;
c.n:=f
end
end;

{ Multiplication }
procedure Mul(a,b:tNum; var c:tNum);
var
i,j,s,x: integer;
d: tNum;
f: boolean;
begin
Norm(a,1);
Norm(b,0);
c.n:=a.n xor b.n;
f:=false;
s:=0;
d.b:=a.b;
for j:=1 to L do begin
x:=0;
for i:=1 to L-1 do begin
x:=b.m[j]*a.m[i]+x;
d.m[i]:=x mod a.b;
x:=x div a.b
end;
d.m[L]:=x;
d.e:=s;
Inc(s);
if f then Ad(c,d,c) else begin
c:=d;
f:=true
end
end;
if x>0 then Norm(c,0) else Norm(c,1);
c.e:=a.e+b.e-1
end;

{ Division }
procedure Dv(a,b:tNum; var c:tNum);
var
i,j,k,expa,expb:integer;
d,d0: tNum;
begin
Norm(a,0);
Norm(b,0);
expa:=a.e;
expb:=b.e;
c.n:=a.n xor b.n;
a.e:=0;
b.e:=0;
a.n:=false;
b.n:=false;
for j:=L downto 1 do begin
k:=0;
repeat
Sb(a,b,d);
if d.n then break;
a:=d;
Inc(k);
until false;
c.m[j]:=k;
Dec(b.e)
end;
c.e:=expa-expb+1;
c.b:=a.b
end;

{ Addition, with sign }
procedure Add(a,b:tNum; var c:tNum);
begin
if a.n then if b.n then begin
Ad(a,b,c);
c.n:=true
end
else Sb(b,a,c)
else if b.n then Sb(a,b,c)
else Ad(a,b,c)
end;

{ Substruction, with sign }
procedure Sub(a,b:tNum; var c:tNum);
begin
if a.n then if b.n then Sb(b,a,c)
else begin
Ad(a,b,c);
c.n:=true
end
else if b.n then Ad(a,b,c)
else Sb(a,b,c)
end;

begin
Dv(a,b,c);
WrNum(a); WriteLn;
WrNum(b); WriteLn;
WrNum©; WriteLn;
ReadLn
end.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 1.06.2024 18:35
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"