Текущий архив: 2002.10.31;
Скачать: CL | DM;
Вниз
является ли дробь переодичной? Найти похожие ветки
← →
lak_b (2002-10-11 00:58) [0]как это попределить _математически_ хотяб.... а потом ни на пае найтиее период...))
← →
MJH (2002-10-11 01:14) [1]>переодичной
>как это попределить
>хотяб.... а потом ни на пае найтиее
ты хоть русский выучи, потом уже и математику :)
← →
Mystic (2002-10-11 03:29) [2]1) все числа на компьютере представляются с ограниченной точностью. Следдовательно все числа являются рациональными.
2) Всегда можно отыскать наилучшее приближение числа в виде рациональной дроби, знаменатель которой не превышает наперед заданное число.
Тогда проверить дробь на периодичность, или, что то же самое, на рациональность, можно при помощи следующего алгоритма:
А) Находим наилучшее приближение данного числа рациональной дробью, со знаменателем, не превосходящим например, 1000.
Б) Сравниваем подученное приближение с самим числом.
Таким образом, если числа совпадают с заданной точностью, то мы можем быть уверенным в том, что дробь рациональна.
Если числа не совпадают, значит или это рациональная дробь, знаменатель которой превышает 1000, либо ирациональное число.
Вот примерный исходник
procedure FloatToRational(X: Extended; var Num, Denom: Int64; MaxDenom: Int64);
var
Qs: Int64;
P, Pprev, Pnext: Int64;
Q, Qprev, Qnext: Int64;
begin
Pprev := 1;
Qprev := 0;
Pnext := Trunc(X);
Qnext := 1;
X := Frac(X);
while Qnext < MaxDenom do
begin
if X < 1E-6 then Break;
X := 1 / X;
Qs := Trunc(X);
X := Frac(X);
P := Qs * Pnext + Pprev;
Q := Qs * Qnext + Qprev;
Qprev := Qnext;
Pprev := Pnext;
Qnext := Q;
Pnext := P;
end;
Num := Pnext;
Denom := Qnext;
end;
.....................
FloatToRational(X, N, D, 1000);
if Abs(N/D - X) < 1E-12
then Label1.Caption := "Rational"
else Label1.Caption := "Not rational";
Страницы: 1 вся ветка
Текущий архив: 2002.10.31;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.008 c