Somebody of the crowd
11.11.2012 17:10
Доброго времени суток уважаемые форумчане! Столкнулась с проблемой, из-за которой не могу двигаться дальше.
Подзадача: Вводится любая десятичная дробь, с любым количеством знаков до и после запятой. Перевести ее в обыкновенную, т.е. вида (a/b).
Все казалось бы очень просто, вот только введенная десятичная дробь, даже если ничего с ней не делать, не совпадает с выводом этой же дроби, появляются какие-то лишние цифры.
Отсюда, как следствие:
Int(x)+Frac(x) не равняется х!
Кто знает, подскажите, что нужно сделать, чтобы Паскаль не добавлял лишние цифры к введенной десятичной дроби?
Вы спользуете тип real, а работа с вещественными числами обладает своей спецификой.
Например вещественные числа нельзя сравнивать напрямую а=b, они сравниваются abs(a-b)<eps.
Поскольку значения вещественного типа являются приблизительными, результат сравнения значений различного вещественного типа не всегда можно предсказать. Например, если Х - переменная вещественного типа с одинарной точностью, а Y - переменная вещественного типа с двойной точностью, то результатом выполнения следующих операторов будет значение False:
X := 1/3;
Y := 1/3;
Writeln(X = Y);
Причина этого состоит в том, что Х имеет точность только до 7-8 цифр, а Y - точность до 15-16 цифр, и когда оба значения преобразуются к типу с повышенной точностью, то после первых 7-8 цифр остальные цифры будут различаться. Аналогично, результатом выполнения операторов:
X := 1/3;
Writeln(X = 1/3);
будет значение False, результат 1/3 в операторе Writeln вычисляется с точностью до 20 значащих цифр.
Поэтому единственный способ, который мне щас приходит в голову, это создавать массив целых чисел, записывать туда ваще число и работать с с ним.
Somebody of the crowd
11.11.2012 20:23
Большое спасибо, Krjuger )))