Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Преобразование дробной и целой части REAL-числа в два целых

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

Для ее запуска достаточно в подсказке DOS набрать ее имя и число:

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
Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay