Форум «Всё о Паскале» _ Задачи _ Перевод дроби из 10 в N-ричную
Автор: s3ct 27.05.2006 23:31
Код
function FromDec(n, radix:longint):string; var s: String; const digit: string[16]='0123456789ABCDEF'; begin s:=''; repeat s:=digit[(n mod radix)+1]+s; n:=n div radix; until n=0; FromDec:=s; end;
в FAQ нашел код для перевода только целых чисел, а как быть с дробными ?
Автор: volvo 27.05.2006 23:35
Ищи в поиске (в разделе Дельфи), там точно был рабочий код... По-моему, тема называлась "Калькулятор", или что-то типа этого...
Автор: s3ct 27.05.2006 23:44
Код
function ToDec(n:string; radix:longint):real; var _int: longint; _frac: real;
s: string; i, p: byte; const digit: string[16]='0123456789ABCDEF';
begin p := pos('.', n); if p = 0 then s := n else s := copy(n, 1, p - 1);
_int := 0; _frac := 0.0;
while s[1] = '0' do delete(s, 1, 1); for i := 1 to length(s) do _int := _int * radix + pos(n[i], digit) - 1;
if (p <> 0) and (p < length(n)) then begin // <--- Здесь !!!
s := copy(n, p + 1, 255); while s[length(s)] = '0' do delete(s, length(s), 1);
for i := 1 to length(s) do _frac := _frac + 1 / stepen(radix, i);
end; ToDec := _int + _frac; end;
Нашел только ToDec, помогите модифицировать ее в FromDec , и думаю это можно будет запостить в FAQ
Автор: volvo 27.05.2006 23:52
Это - неверный вариант... Верный приведен здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=10639&view=findpost&p=69916
Цитата(s3ct @ 27.05.2006 19:44)
Нашел только ToDec, помогите модифицировать ее в ToDec
Автор: s3ct 28.05.2006 0:01
Исправил
Автор: antonioSP 29.05.2006 0:05
Вот мой вариант fromdec, вроде потестил работает нормально:
function FromDec(n:real; radix:longint):string; var q:real; i,j:integer; s,f,u: String; const digit: string[16]='0123456789ABCDEF'; begin u:=''; if n<0 then begin u:='-'; n:=abs(n); end; if frac(n)>0 then begin i:=0; q:=frac(n); s:=''; j:=strtoint(floattostr(int(n))); repeat s:=digit[(j mod radix)+1]+s; j:=j div radix; until j=0; repeat q:=frac(q)*radix; f:=f+digit[trunc(q)+1]; q:=frac(q); i:=i+1; until (q=0)or(i=8);; FromDec:=s+','+f; end else begin s:=''; j:=trunc(n); repeat s:=digit[(j mod radix)+1]+s; j:=j div radix; until j=0; FromDec:=u+s; end; end;