Другие языки программирования и технологии

Pascal ABC помогите пожалуйста.

Ввести десятичную дробь │Х│<1 и основание новой системы счисления (q<=10). Перевести десятичную дробь в новую систему счисления. (при этом в случае перевода например в троичную систему, число не должно высвечиваться как бесконечное, необходимо высветить период этого числа. и вариант с ограничением цифр после запятой тоже не подходит).
Я написал сам алгоритм перевода, но период не знаю как расписать в программе.
если есть возможность, просто дополните пожалуйста про период:
var
x, y, z, q, k: real;

begin
k := 0;
readln(x, q);
if (x > 1) or (x < -1) then exit
else
x := abs(x);
write('0.');
while (x < 1) do
begin
k := k + 1;
y := x * q;
z := trunc(y);
write(z);
if y > 1 then
x := y - trunc(y)
else
x := y;
end;
end.
Манипулируя действительными числами такое сделать нельзя!
Ибо машинное представление действительного числа создаёт иллюзию истинности результата…
На самом деле, при работе с действительными числами, очень быстро накапливаются ошибки.
К примеру, если взять число 0.2 и начать переводить его в СС с основанием 3, то необходимо выполнять следующие действия:

0.2*3=0.6 (0)
0.6*3=1.8 (1)
0.8*3=2.4 (2)
0.4*3=1.2 (1)

Кажется, мы нашли период!
0.2 (10) → 0.(0121) (3)

Но это только кажущееся правильное решение. Ибо мы его выполняли „на бумаге“…

А что же должно происходить в компьютере?

Попробуем посмотреть, при переводе 0.2 из десятичной в двоичную СС:

0.2 *2 = 0.4 (0)
0.4 *2 = 0.8 (0)
0.8 *2 = 1.6 (1)
0.6 *2 = 1.2 (1)

Значит 0.2 (10) → 0.(0011) (2) или 0.001100110011001100110011 и т. д., но ведь действительное число в памяти компьютера ограничено. И данная дробь должна прерваться!
А попробуем сделать обратное преобразование хотя бы для значения 0.0011001100110

             1/2 = 0.5      — 0
           0.5/2 = 0.25      — 0
          0.25/2 = 0.125      — 1
         0.125/2 = 0.0625      — 1
        0.0625/2 = 0,03125      — 0
       0,03125/2 = 0,015625      — 0
      0,015625/2 = 0,0078125      — 1
     0,0078125/2 = 0,00390625      — 1
    0,00390625/2 = 0,001953125      — 0
   0,001953125/2 = 0,0009765625      — 0
  0,0009765625/2 = 0,00048828125      — 1
 0,00048828125/2 = 0,000244140625      — 1
0,000244140625/2 = 0,0001220703125      — 0

Теперь сложим числа, напротив которых стоят единицы:

0.125+0.0625+0.0078125+0.00390625+0.00048828125+0.000244140625 = 0,199951171875

Вот видите, что 0.2 (10) ≠ 0.(0011) (2).

И накопление таких ошибок приводит к тому, что в языках программирования не используют сравнение действительного с 0.
Т. е. если мы в математике пишем d=0, то в ЯП нужно использовать вот такую математическую запись |d| < ε.
Где ε — это какая-то константа типа 1e-5 или 1е-8.
Sherzod Djalolov
Sherzod Djalolov
94 812
Лучший ответ