Page 43

ПРО

№13 (апрель) 2011

граммист

АЛГОРИТМЫ цифрой 5. Добавлять единицу в следующий

деления на нуль. Школьный курс математики

Так что пусть программист сам решает, как

математика уточняет: операция возможна, но

разряд или не добавлять? Вот в чем вопрос... ему округлить удобней (за счет манипуляций с последними разрядами).

Однако вернемся еще раз к делению. Чтобы

получить нужное количество разрядов, нужно будет провести небольшой анализ. Общий смысл получения разрядов таков: Пусть

имеются

два

числа:

0.5

и

0.2.

В

результате выравнивания мы получим числа 5

и 2, от деления которых (нацело, разумеется) мы получим число 2. Всего один разряд, а нам

как всегда хочется немного больше. Для этого первый операнд нужно домножить – дать

нужное количество разрядов. 50, деленное на 2, даст нам 2 разряда, 500 на 2 даст три

разряда (правда, один незначащий, то есть для

нашей

операции

достаточно

двух

разрядов) и т.д. Здесь есть пара нюансов, сразу не видных. Первый:

вы

получите

сколько

надо,

деленное

на

однако

столько

деление

разрядов, может

закончиться раньше. В том же примере 0.5, 0.2,

даст

2.5,

то

есть

два

действительных разряда, независимо от того насколько бы 5 ни домножали. Второй:

вычитания

как

с

операцией

нужно

беззнакового

учитывать

старшие

разряды. То есть для деления 0,2 на 0,5 нужно брать на разряд больше, потому что операция

деления нацело 2 на 5 даст в результате нуль – кстати, весьма справедливо (можно считать его целым нулем, за которым следует дробная

часть числа). То есть осуществлять деление 20 на 5 и 5 на 2 (а не 50 на 2).

Кстати, деление имеет немалый философский и логический подтекст. Например, в случае

говорит, что это просто невозможно. Высшая

с большим числом оговорок. В нашем случае будет три операции деления (одна деление нацело),

учитывающих

такой

вариант

развития событий как деление на нуль. В

одном случае деление на нуль невозможно. Это

отражается

в

форме

исключительной

ситуации при делении на нуль. Во втором

случае деление на нуль вернет очень большое

число (конкретно я предлагаю возвращать 0.(9)*10^100), что имеет смысл при решении ряда

практических

задач.

Вообще-то

положено возвращать максимально большое

число из представимого системой диапазона чисел (это установлено методом приближения

– на нуль поделить проблематично, однако, можно

делить

числа,

по

величине

стремящиеся к нулю, попробуйте сами 1/1, 1/0.5, 1/0.25, 1/0.125 и т.д. – с каждым шагом результат увеличивается).

К сожалению, для разных компьютеров (а также для разных моментов времени работы

программы на данных компьютерах) это число различно и определяется памятью, которую операционная система готова дать вам под

максимальное число. Кроме того, даже если

система и даст вам такое число, то, как правило,

затрачиваемая

на

него

память,

предельна для работы данной программы, и дальнейшая

работа,

скорее

всего,

будет

невозможна. То есть это приведет к краху программы. Но раз уж если мы условились

получать хоть какой-то результат, то надо его и обрабатывать далее (иначе какой тогда смысл делить на нуль?). Поэтому я предлагаю получать

количество должно

нефатальное разрядов:

быть

для

вместе

достаточно

с

программы тем

большим,

оно

чтобы

приблизиться к нашей модели вычислений. С учетом количества памяти в современных

43

PROgrammist, №13  

Official editorial layout

PROgrammist, №13  

Official editorial layout

Advertisement