ого!, здо'рово! попытаюсь разобраться, вот хотел ещё узнать при конвертации если количество знаков в дробной части увеличивается часть из них может перейти в целую часть числа? зависит ли положение запятой от того в большую сс переводишь число или в меньшую? я кстати сделал уголок, но вот запятая всё косячит не знаю пока, если пойму возьмусь за твою идею)
хотел ещё узнать при конвертации если количество знаков в дробной части увеличивается часть из них может перейти в целую часть числа?
Дробная часть меньше единицы, целая - больше. Они живут отдельно, независимо. Нет, знаки не могут "переходить".
Я тут на досуге накорябал все четыре действия над вещественными числами . Любая длина (до 32К), любое основание (до 32К), со знаками. Теперь сделать конвертацию займет не более 15 минут.. Если хочешь - могу показать.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
Дробная часть меньше единицы, целая - больше. Они живут отдельно, независимо. Нет, знаки не могут "переходить".
Я тут на досуге накорябал все четыре действия над вещественными числами . Любая длина (до 32К), любое основание (до 32К), со знаками. Теперь сделать конвертацию займет не более 15 минут.. Если хочешь - могу показать.
1. Что знечит "любое основание"? Или числа хранятся в виде текста? 2. 15 минут на конвертацию числа - это сильно даже для IBM PC с ее 4.77. МГц.
lapp, если не трудно, выложи я вот конвертацию уже рабочую слепил, умножение, деление через конвертацию, осталось подумать над сложжением и вычитанием толковым, но выкладывай всё - интересно!
Выкладываю. Предупреждаю: 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;