Значение введенной десятичной дроби не совпадает с ее выводом, Это нужно для перевода из десятичной дроби в обыкновенную |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Значение введенной десятичной дроби не совпадает с ее выводом, Это нужно для перевода из десятичной дроби в обыкновенную |
Somebody of the crowd |
11.11.2012 13:10
Сообщение
#1
|
Группа: Пользователи Сообщений: 2 Пол: Женский Реальное имя: Мария Репутация: 0 |
Доброго времени суток уважаемые форумчане! Столкнулась с проблемой, из-за которой не могу двигаться дальше.
Подзадача: Вводится любая десятичная дробь, с любым количеством знаков до и после запятой. Перевести ее в обыкновенную, т.е. вида (a/b). Все казалось бы очень просто, вот только введенная десятичная дробь, даже если ничего с ней не делать, не совпадает с выводом этой же дроби, появляются какие-то лишние цифры. Отсюда, как следствие: Int(x)+Frac(x) не равняется х! Кто знает, подскажите, что нужно сделать, чтобы Паскаль не добавлял лишние цифры к введенной десятичной дроби? |
Krjuger |
11.11.2012 14:59
Сообщение
#2
|
Профи Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: 20 |
Вы спользуете тип 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 16:23
Сообщение
#3
|
Группа: Пользователи Сообщений: 2 Пол: Женский Реальное имя: Мария Репутация: 0 |
Большое спасибо, Krjuger )))
|
Текстовая версия | 20.06.2024 16:23 |