Советы по Delphi. Версия 1.4.3 от 1.1.2001 (Озеров) - страница 2

>CONTFRAC 3.141592654


>program contfrac;       { непрерывные дроби }

> {$N+}

>const

> order    = 20;

>var

> y, lasterr, error, x: extended;

> a: array [0..order] of longint;

> i, j, n: integer;

> op, p, q: longint;

>begin

> lasterr := 1e30;

> val(paramstr(1), y, n);

> if n <> 0 then halt;

> x := y;

> a[0] := trunc(x);

> writeln;

> writeln(a[0]:20, a[0]:14, 1:14);

> { это может вызвать резкую головную боль и галлюцинации }

> for i := 1 to order do begin

>  x := 1.0 / frac(x);

>  a[i] := trunc(x);

>  p := 1;

>  q := a[i];

>  for j := pred(i) downto 0 do begin

>   op := p;

>   p := q;

>   q := a[j] * q + op;

>  end;

>  error := abs(y – int(q) / int(p));

>  if abs(error) >= abs(lasterr) then halt;

>   writeln(a[i]:20, q:14, p:14, error:10);

>  if error < 1e-18 then halt;

>  lasterr := error;

> end;

>end.

Теперь попытаюсь объяснить мой алгоритм (он, по-моему, достаточно быстрый). Вот схема:

Допустим, мы используем число 23.56.

Берем наше натуральное число и производим целочисленное деление на 1.

23.56 div 1 = 23

Теперь вычитаем результат из числа, с которого мы начали.

23.56 – 23 = .56

Для преобразования значения в целое мы просто умножаем его на 100, и, при необходимости, приводим его к целому.

>valA := (val div 100);

>valB := (valA – val);

or

>valB := (valA – val) * 100;


>val = 23.56

>ValA = 23

>ValB = .56 or 56

Есть ли функция, выполняющая пpеобpазование пеpеменной real в integer?

Nomadic советует:

Hа самом деле есть две функции — Round и Trunc (округление и отсечение дробной части соответственно).

Кстати, функции эти были уже в самых ранних версиях Паскаля. Так что мой совет — изучите Паскаль — полезно.

Hy, если yж дело идет к изyчению списка фyнкций :), то yпомянy еще Ceil и Floor. Unit Math;

Кстати, втоpая из них мне очень пpигодилась для полyчения экспоненты числа. Имеется в видy экспонента: X=1E 13 [001193]

Почему непpавильно pаботает функция StrToFloat?

Nomadic советует:

Пишу даже прямо StrToFloat('32.34'), к примеру, получаю исключение «'32.34' is not valid float». Если пишу число без десятичной точки, то все ОК. А какой у тебя DecimalSeparator? В Russian settings почему-то по умолчанию считается, что разделитеь дроби – запятая. Пеpеустанови пpи запуске пpогpаммы

>DecimalSeparator := '.';

Или пользуйся этой функцией так:

>StrToFloat('32,24');

Число строкой X

Сергей AKA WildSery прислал свой вариант:

Привожу мой вариант, написал для своего приложения за 20 минут. В силу специфики приложения не утруждал себя прописью полностью "рублей" и "копеек", а ограничился "руб." и "коп.", а также не было необходимости в знаке числа, по это все добавляется буквально 3-4 строками.