Ввести десятичную дробь │Х│<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.
Другие языки программирования и технологии
Pascal ABC помогите пожалуйста.
Манипулируя действительными числами такое сделать нельзя!
Ибо машинное представление действительного числа создаёт иллюзию истинности результата…
На самом деле, при работе с действительными числами, очень быстро накапливаются ошибки.
К примеру, если взять число 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.
Ибо машинное представление действительного числа создаёт иллюзию истинности результата…
На самом деле, при работе с действительными числами, очень быстро накапливаются ошибки.
К примеру, если взять число 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.

Demuri Kevlishvili
500 р ?
Похожие вопросы
- Ребят, кто знает Pascal ABC, помогите.
- Pascal ABC. Помогите исправить ошибку в программе.
- Задача Pascal , строки , помогите пожалуйста !!!
- Проблема с программой в Pascal ABC,Встречено ';',а ожидалось ':'. Если менять, то вылетает ещё ошибка с if
- Программа в pascal abc
- Помогите пожалуйста решить задачу в Pascal ABC
- народ помогите пожалуйста) надо сделать прогу на pascal)
- Подскажите пожалуйста, какая ошибка в программе на Pascal ABC.NET?
- помогите с задачей по Pascal abc!!!
- Помогите с задачей на Pascal ABC