round в паскале что

Вещественные числа

Вещественные, или действительные, числа — это, грубо говоря, и целые и дробные. Они, конечно, нередко возникают в задачах, но при работе с ними возникают серьезные проблемы, которые не в каждой книге по программированию будут описаны.

Как компьютер хранит вещественные числа?

(Если вы не поймете, что написано в этом разделе, это не очень страшно, но попробуйте понять.)

Вещественные числа, с которыми может иметь дело компьютер, могут быть как очень большими, так и очень маленькими. С другой стороны, вещественные числа в принципе невозможно хранить абсолютно точно, т.к. в них могут быть очень много знаков (даже бесконечно много) после запятой.

Еще более точно — компьютер хранит числа в двоичной системе счисления; все примеры выше сделаны в десятичной системе только для простоты.

Типы данных

Все современные компьютеры умеют работать со следующими тремя типами данных:

5000, занимает в памяти 10 байт, работает намного медленнее;

Эти типы поддерживаются процессором (т.е. процессор умеет выполнять команду «сложить два числа типа single» или «вычесть два числа типа extended» и т.п.). Поэтому эти типы присутствуют (возможно, с другими названиями) во всех существующих языках программирования.

В питоне нет простой возможности выбрать один из этих трех типов, по умолчанию доступен только тип double, причем в питоне он называется float (!).

Про вывод подробнее

Часто в наших задачах вы можете встретить фразу «выведите ответ с точностью до 5 знаков после запятой», или «с пятью верными знаками» и т.п. Такие фразы почти всегда обозначают, что ваш ответ должен содержать 5 верных цифр после запятой, но они не запрещают вам выводить больше цифр. Вы можете вывести хоть 20 цифр — если первые пять из них верные, то ответ будет зачтен. И наоборот, вы можете вывести меньше цифр — если невыведенные цифры — нули, то ответ тоже будет зачтен. Вообще, строго говоря, такая фраза в условии просто обозначает, что ваш ответ должен отличаться от верного не более чем на 1e-5.

Пример: если правильный ответ на задачу — 0.123456789, то вы можете вывести 0.12345, или 0.123459876, или даже 1.2345e-1 (т.к. это то же самое, что и 0.12345). А если правильный ответ — 0.10000023, то вы можете вывести 0.10000, 0.10000987 или даже просто 0.1 или 1e-001 (т.к. это то же самое, что и 0.10000).

В частности, это обозначает, что вы можете пользоваться стандартными функциями вывода (writeln и print) без каких-либо особых ухищрений; не надо округлять число, не надо форматировать вывод и т.д.

Вот если в задаче строго сказано «вывести ровно с 5 знаками после запятой», то это другое дело. Но на приличных олимпиадах такое бывает очень редко.

Полезные функции

Пример программы, используйющей эти функции:

Погрешности

Два правила работы с вещественными числами

Сначала напишу два главных правила работы с вещественными числами:

Ниже я разъясняю оба этих правила.

Необходимость использования eps

Как уже говорилось выше, компьютер не может хранить все цифры числа, он хранит только несколько первых значащих цифр. Поэтому, если, например, разделить 1 на 3, то получится не 0.33333. (бесконечно много цифр), а, например, 0.33333333 (только несколько первых цифр). Если потом умножить результат обратно на 3, то получится не ровно 1, а 0.99999999. (Аналогичный эффект есть на простых калькуляторах; на продвинутых калькуляторах он тоже есть, но проявляется сложнее.)

Поэтому если вы напишите, например, следующий код:

(для питона такой простой пример у меня подобрать пока не получилось, но в более сложных примерах есть аналогичные проблемы.)

На самом деле все еще хуже: компьютер работает в двоичной системе счисления, поэтому даже числа, в которых в десятичной системе счисления конечное число цифр, в компьютере могут представляться неточно. Поэтому, например, сравнение if 0.3+0.6=0.9 тоже не сработает: если сложить 0.3 и 0.6, то получится не ровно 0.9, а слегка отличающее число (0.899999 или 0.900001 и т.п.)

(На питоне все тут проявляется еще ярче: print(0.3+0.6) выводит у меня 0.8999999999999999.)

Итак, погрешности, возникающие при любых вычислениях, — это основная проблема работы с вещественными числами. Поэтому если вам надо сравнить два вещественных числа, то надо учитывать, что, даже если на самом деле они должны быть равны, в программе они могут оказаться не равны.

Итак, именно поэтому

(Первое правило будет дальше 🙂 )

* за исключением случаев, когда вам не важно, что произойдет в случае точного равенства, см. ниже.

Выбор eps

Но обычно считают, что в «разумных» задачах все-таки такое eps существует, т.е. числа, которые должны быть равны, отличаются не очень сильно, а те, которые должны отличаться, отличаются намного сильнее. И eps выбирают где-нибудь посередине. (В частности, поэтому, как говорилось выше, не бывает так, что x=y-eps точно.) (В более сложных задачах может понадобиться применять более сложные техники, но мы их сейчас не будем обсуждать.)

Но бывают задачи, где так просто вычислить подходящее eps не получается. На самом деле таких задач большинство — как только вычисления у вас становятся сложнее чем сложить два числа, за погрешностями уже становится сложно уследить. Можно, конечно, применять какие-нибудь сложные техники, но обычно принято просто брать какое-нибудь eps порядка 1e-6..1e-10.

В частности, поэтому на олимпиадах очень не любят давать задачи, которые реально требуют вычислений с вещественными числами — никто, даже само жюри, не может быть уверено в том, что у них eps выбрано верно. Но иногда такие задачи все-таки дают, т.к. никуда не денешься.

Собственно, из этого и следует

В частности, в будущем вы заметите, что во многих задачах, которые, казалось бы, подразумевают вещественные входные данные (например, задачи на геометрию), входные данные тем не менее обычно целочисленны. Это сделано именно для того, чтобы можно было написать решение полностью в целых числах, и не иметь проблем с погрешностью. (Не всегда такое решение возможно, и уж тем более не всегда оно простое, но тем не менее.) Поэтому если вы можете написать такое решение, лучше написать именно его.

Дополнительный материал. «Грубые» задачи: когда eps не нужно

Так иногда бывает — когда вам все равно, в какую ветку if’а вы попадете, если два сравниваемых числа на самом деле равны между собой. В таком случае eps использовать не надо. Но каждый раз тщательно думайте: а правда ли все равно? Всегда лучше перестраховаться и написать eps (выше с eps тоже все работало бы), за исключением совсем уж простых случаев типа приведенного выше вычисления максимума.

Еще пример: считаем сумму положительных элементов массива

Еще пример, где уже eps необходим: определим, какое из двух чисел больше:

Вообще, тут полезно следующее понятие. Назовем задачу (или фрагмент кода) грубым, если ответ на задачу (или результат работы этого фрагмента) меняется не очень сильно (не скачком) при небольшом изменении входных данных, и негрубым в противоположном случае. (Понятие грубости пришло из физики.)

Тогда в задаче (фрагменте кода) eps нужен, если задача является негрубой: тогда существуют такие входные данные, которые вам важно отличить от очень близких им. Например, если надо определить, какое из двух чисел больше, то при входных данных «0.3 0.3» надо ответить «они равны», но при очень небольшом изменении входных данных, например, на «0.300001 0.3» ответ резко меняется: надо отвечать «первое больше».

Если же задача (или фрагмент кода) является грубым, то, скорее всего, в нем можно обойтись без eps : если вы чуть-чуть ошибетесь при вычислениях, ответ тоже изменится не очень сильно. Например, если вы вычисляете максимум из двух чисел, то на входных данных «0.3 0.3» ответ 0.3, а на входных данных «0.300001 0.3» ответ 0.300001, т.е. изменился не очень сильно.

Но, конечно, все приведенное выше рассуждение про грубые задачи — очень примерно, и в каждой задаче надо отдельно думать.

Источник

Урок 5. Математические операции, функции и процедуры в Pascal (Часть первая)

round в паскале что. Смотреть фото round в паскале что. Смотреть картинку round в паскале что. Картинка про round в паскале что. Фото round в паскале что

Так как в воскресенье на сайте открывается новая рубрика — решение задач, мы с вами должны по-быстрому изучить основную часть математических операций, функций и процедур.

Давайте разберемся, что такое функция и процедура. Это подпрограмма — часть программы, выполняющая определенный алгоритм и допускающая обращение к ней из различных частей общей программы. В чем же разница между процедурой и функцией?

Процедуры — мини-программы.

Процедуры используются в случаях, когда в подпрограмме необходимо получить несколько результатов. Из картинки, расположенной ниже вы видите, как работает процедура. Входных данных может не быть вовсе, а может быть сто.

round в паскале что. Смотреть фото round в паскале что. Смотреть картинку round в паскале что. Картинка про round в паскале что. Фото round в паскале что

Например, программист хочет в своем суперкоде между блоками выходящих значений прописывать 20 амперсандов. Чтобы облегчить себе задачу, он напишет простую подпрограмму.

Функции в Паскале — мега переменные.

Функции отличается от процедуры тем, что после выполнения функции на ее месте в коде ставится одно число, буква, строка и т.д. Набор встроенных функций в языке Паскаль достаточно широк. Например, для того, чтобы подсчитать квадрат числа можно воспользоваться стандартной функцией sqr(x). Как вы, наверное, уже поняли sqr(x) требует лишь один фактический параметр — число.

Обратите внимание! Функции необходимо присваивать! Просто написав их в тексте программы, как процедуры, вы ничего не добьетесь!

Структура функции представлена на картинке ниже.

round в паскале что. Смотреть фото round в паскале что. Смотреть картинку round в паскале что. Картинка про round в паскале что. Фото round в паскале что

Если в программу необходимо включить новую уникальную функцию, ее надо описать также, как процедуру. Более подробно о том, как делать собственные процедуры и функции, мы поговорим через 10 уроков. Ниже вы видите таблицу основных стандартных функций и процедур в Паскаль.

ИмяТип аргументаРезультат вычисленияПримерAbs(x)Целый или Вещ.Модуль хAbs(-6) = 6Sqrt(x)ВещественныйКорень из хSqrt(25)=5Sqr(x)Целый и Вещ.Квадрат хSqr(5)=25Power(x, a)ВещественныйЗначение х аPower(5,3)=125Frac(x)ВещественныйДробная часть хFrac(5.67)=0.67Sin(x)ВещественныйСинус хSin(45)=0.8509Cos(x)ВещественныйКосинус хCos(45)=0.5253Arctan(x)ВещественныйАрктангенс хArctan(5)=1.3734Int(x)ВещественныйЦелая часть хInt(5.67)=5.0Random(x)ЦелыйСлучайное число (0..х-1)Random(5)=4Succ(x)ПорядковыйСледующийSucc(10)=11Pred(x)ПорядковыйПредыдущийPred(‘Z’)=’Y’Trunc(x)ВещественныйЦелая часть хTrunc(5.67)=5Round(x)ВещественныйОкругление х до целогоRound(5.67)=6Важно! Если х = 5.5, то результат – 6, а если х = 6.5, то результат тоже 6!?

round в паскале что. Смотреть фото round в паскале что. Смотреть картинку round в паскале что. Картинка про round в паскале что. Фото round в паскале что Очень странная ошибка.

Операции div и mod.

Иногда нам требуется найти частное либо же остаток от деления. В такие моменты на помощь нам приходят такие операции, как div и mod. Заметим, что эти операции выполняются только над целыми числами.

Для того, чтобы найти частное от деления, мы используем операцию div.

Для того, чтобы найти остаток от деления, мы используем операцию mod.

Чтобы окончательно понять, с чем мы имеем дело, решим следующую задачу:

Задача 1. Найти сумму цифр двухзначного числа.

Так как эта задача очень простая, мы с вами обойдемся блок-схемой и программой.

Задача 2. Найти сумму цифр трехзначного числа.

Чуть усложненная версия предыдущей задачи. Самая большая сложность — вторая цифра.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *