Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

Курс видеоуроков КРЭКЕРСТВО + ПРОГРАММИРОВАНИЕ 2017
(актуальность: май 2017)
Свежие инструменты, новые видеоуроки!

  • 400+ видеоуроков
  • 800 инструментов
  • 100+ свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Преобразование дробной и целой части 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



<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS