Наставник (67461)

Калькуляторы

Есть некоторые детские увлечения, страсть к которым так до кона не проходит с годами. Одно из них - калькуляторы. Не знаю, чем они производили на меня такое впечатление. Вероятно, мне нравилась математика и нравились игры, а калькуляторы могли совмещать в себе и то и другое. Компьютеры - это, конечно, тоже круто, но ведь компьютеры досконально не изучишь: ни железо, ни ПО, а о калькуляторе, попавшем мне в руки, я обычно старался узнать всё.
Первым калькулятором, попавшем мне в руки ещё в детстве был вот этот:



Да, вот такая вот толстенькая машинка с выключателем в виде рычажка, с красным светодиодным дисплеем и с чёрно-сине-жёлтыми кнопочками. Меня, конечно, больше всего восхищали жёлтенькие кнопочки, светящиеся циферки, а ещё то, как он вычислял, задумавшись на полсекунды и мигнув всеми своими индикаторами, после чего выводил результат. Правда функционал у него был весьма убогий: 4 арифметических действия и память, да и всего 8 разрядов, но тогда-то я ещё не знал, что на калькуляторе можно делать что-то ещё.
Помню, тоже ещё когда я был ребёнком, отцу его американские коллеги подарили калькулятор Casio. Модель, конечно, не помню, найти вряд ли смогу. Было это где-то то ли в конце 80-х, то ли в начале 90-х. Но вот тогда я понял, что значит настоящий калькулятор. Он был очень лёгкий, компактный и на нём была куча кнопочек, о назначении которых я даже догадываться не мог в то время, т.к. ходил только в начальную школу. Кажется, он даже был программируемым, и точно умел считать обыкновенные дроби (что для меня в то время было просто чудом). Помню, инструкция к нему представляла собой толстую книжечку страниц на 100(!) с красивыми изображениями блестящих металлических и стеклянных геометрических фигур: шаров, параллелепипедов и т.п. А потом его у отца украли, а инструкция ещё долго валялась где-то у меня на столе.
Классе в третьем, помню, нам прислали гуманитарную помощь из Америки. Каждому вручили по коробке, где среди прочих канцелярских принадлежностей были и калькуляторы. Они были разных форм и размеров, но функционально практически идентичны: самые обычные калькуляторы, которые и сейчас можно купить в любом канцелярском магазине. Набор функций лишь самую малость шире чем у "Электроника Б3-24Г": к арифметическим действиям добавлено только извлечение квадратного корня и проценты. После папиного Casio это как-то не особо прельщало.
Зато когда я стал чуть постарше, уже в средней школе, папа подарил вот такую штуку:



Вот с этим уже можно было знатно поиграться. Тут уже не только считать можно было, но и самому рисовать символы и писать программы даже с анимацией. Правда, конечно, качественную 3D-графику на МК-85 получить проблематично, но на Youtube есть даже видео, где один энтузиаст сумел на такой машинке нарисовать что-то типа "Принца Персии" - того самого старого DOS-овского, если кто ещё помнит такое. В общем, весёлое было время тогда, особенно если учесть, что примерно в то же время, наш класс по определённым дням стал ходить в специальную компьютерную школу для обучения программированию на том же Бэйсике, на котором писались программы для МК-85, правда, конечно, не таком урезанном, и я чувствовал себя крутым программистом от того, что знаю, что такое циклы со счётчиком и что такое оператор условного перехода.
Но вернёмся к калькуляторам. Я узнал, что бывают т.н. инженерные или научные калькуляторы (до сих пор не знаю, в чём разница), с довольно широким набором функций. Конечно, в сравнении с теми примитивными калькуляторами (за исключением Электроники МК-85) они выглядели очень крутыми: и разрядов побольше, и функций и диапазон чисел, с которыми они могли работать подскочил аж до 10100 благодаря возможности показательной формы записи числа, иногда покупал какие-то из них, но, скоро понял, что все они были на одно лицо и, опять же, у всех был практически одинаковый набор функций: арифметика, набор "школьных" функций (тригонометрия и всякие там логарифмы с экспонентами и т.д. и т.п.) и несколько дополнительных режимов: статистика, комплексные вычисления, вычисления в двоичной, восьмиричной и шестнадцатиричной системах. У меня до сип пор есть один такой калькулятор. Называется Brilliant BS-110.
Я всё пытался найти калькулятор, похожий на тот, что украли у отца, но всё время, как будто, чего-о не хватало: вроде и функций много и режимы есть разные, но там точно было что-то ещё, чего здесь не было. И вот относительно недавно нашёл такое чудо:



Тоже Casio, но уже самый современный. Здесь уже есть всё или почти всё: даже производные и интегралы. Все функции, входящие в стандартный набор инженерных калькуляторов здесь есть, но этот список ещё расширен. К режимам прибавились режим решения уравнений (квадратных и кубических) и систем уравнений, матричные и векторные вычисления, а также создание таблиц значений функций, определяемых пользователем (жаль только графики этих функций не выводит). Вместо обычных семисегментников, характерных для калькуляторов, здесь полноценный пиксельный дисплей, позволяющий записывать выражения и выводить результат в "естественной" математической форме. Это особенно подкупает, конечно. Вычисления сумм, интегралов и производных численными методами, решение практически любых уравнений методом Ньютона, вывод результатов вычислений в различных форматах: десятичная дробь, неправильная дробь, смешанная дробь, шестидесятиричный формат (градусы, минуты, секунды). Для комплексных чисел предусмотрена возможность вывода в алгебраической форме и в виде модуля и аргумента и т.д. и т.п. Он даже может выводить дроби с радикалами в виде ответа, например,

он выведет как

или выражения с 𝜋.
Но, к сожалению и у этого калькулятора обнаружились свои ограничения. То, что он не понимает многие математически выражения, такие, как, например, экспонента от комплексного числа, ещё ладно. В конце концов, у большинства других калькуляторов, что я видел, не было даже десятой доли того, что есть здесь. Но вот, что обидно: количество выводимых разрядов для десятичной формы записи так и осталось равным 10, как у стандартных инженерных калькуляторов, это при том, что даже у виндузовых калькуляторов и том калькуляторе, что в моём смартфоне, их порядка 30. И ещё он, к сожалению, оказался очень медленным. Особенно это заметно при итеративных вычислениях, таких, как вычисление суммы, например. Это при том, что тот же калькулятор в смартфоне любые вычисления делает за доли секунды и с поразительной точностью. Правда, функционально он конечно намного слабее, но зато диапазон значений практически ничем не ограничен: может выдавать результат в показательной форме с показателем аж до десятков тысяч.
Интересно проследить, какие сообщения об ошибках выводят калькуляторы. В стандартных моделях даже у инженерных калькуляторов всего одно сообщение об ошибке: "E" или "ERROR". Ничего другого не предполагается. Интересно, что в самых простых калькуляторах, если ошибка возникала при выходе результата за границы диапазона, на дисплее отображалось число, которое равнялось этому результату, уменьшенному на несколько порядков (кажется, 8), т.е. если отображалось что-то типа: E 1.2345678, это означало, что на самом деле результат 123456780. Видимо, это было сделано, чтобы можно было хоть как-то посчитать большие числа. Но вот на сообщениях об ошибках для Casio fx-991ES PLUS и смартфоновского калькулятора хотелось бы остановиться поподробней.
Итак, сначала Casio

Math ERROR Ошибка вычислений. Самая простая и распространённая ошибка. Возникает во всевозможных случаях, когда калькулятор не может справиться с вычислениями, таких как: запрещённая математическая операция (деление на 0, например), операция, которую калькулятор не знает, как выполнять (синус комплексного числа), выход аргумента за пределы области определения данной функции, выход конечного или промежуточного результата за пределы диапазона, в котором может работать калькулятор и т.п. По сути, E обычного калькулятора - это почти всегда и есть Math ERROR у данного.

Stack ERROR Переполнение стека. Всем программистам прекрасно знакома такая штука как "stack overflow", которая возникает, например, при не очень продуманном написании программы, которое приводит к бесконечной рекурсии и соответственно быстрому переполнению памяти. Нечто подобное происходит и здесь, если сделать выражение, содержащее слишком много вложенных функций, приводящее к переполнению оперативной памяти калькулятора. В стандартных инженерных калькуляторах с чем-то подобным можно столкнуться, если ввести слишком много скобок.

Syntax ERROR Ошибка в синтаксисе. Возникает в случае, если выражение написано неверно. Существенное отличие от первых двух ошибок в том, что тут калькулятор вообще не может понять, что от него хотят.

Argument ERROR Самая загадочная ошибка. Я, если честно, до сих пор не очень понимаю, какие мотивы заставили разработчиков выделить её в отдельный класс ошибок. Формально это ошибка связанная с неверным (или как принято говорить у программистов невалидным, т.е. неподходящим) аргументом какой-либо функции или оператора, но по какому принципу эта ошибка отделяется от той же Math ERROR как-то не очень понятно. Например, попытка вычислить факториал от дробного числа или логарифм от нуля приведёт к обычной "Math ERROR", хотя там тоже можно сказать про неверный аргумент. По моим наблюдениям эта ошибка возникает при работе только с двумя функциями калькулятора: операторе суммирования, если один из пределов суммирования сделать нецелым числом или верхний предел сделать меньше нижнего, и при вызове функции RanInt, возвращающей целое случайное число в заданном диапазоне, в аналогичной ситуации.

Dimension ERROR Ошибка размерности. Специфическая ошибка для матричных и векторных вычислений. Возникает либо когда размерность матрицы или вектора вообще не задана, либо если размерн
Продолжение.

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

Variable ERROR Ошибка переменной. Специфическая ошибка, возникающая при решении уравнений методом Ньютона. Дело в том, что если за валидностью аргументов, как мы помним, калькулятор следит далеко не всегда, то за тем, чтобы в уравнении хотя бы раз встречалась переменная, значение которой нужно найти, он следит пристально. И хотя, например, записи "0х=0" и "0=0" формально эквивалентны, вторую, в отличие от первой он уравнением считать откажется.

Can't Solve
Твоё уравнение слишком сложное для меня, хозяин, я не могу его решить, даже методом Ньютона.
Собственно, проще всего такую ошибку получить, если попробовать заставить калькулятор решить уравнение, которое заведомо не имеет решения, например 0х=5.

Insufficient MEM Недостаточно памяти. Нет, это не Stack ERROR, это ещё одна специфическая ошибка, но на этот раз для режима, в котором можно построить таблицу значений функции. Если таких значений получится слишком много (больше 30), калькулятор выдаёт такую ошибку и больше нигде. Название довольно странное, по-моему, с учётом этого.

Time Out
Я долго-долго думал над твоим примером, хозяин, но у меня так ничего и не получилось посчитать.
Это тоже весьма интересная ошибка, о которой следует рассказать подробнее. Дело в том, что, несмотря на свою медлительность, калькулятор почти никогда не отказывается посчитать тот или иной пример, "вылетая по тайм-ауту". Даже если вы зададите ему долгое итерационное вычисление, например, посчитать сумму тысячи слагаемых, он будет долго-долго считать, но ошибку эту не выдаст. Насколько я могу его понять, такую ошибку он выдаёт, если потратил слишком много времени на вычисления, которые, по его мнению, он должен выполнять относительно быстро и укладываться в определённое время. К таким вычислениям относятся, например, численные вычисления интегралов и производных. И тут я применил изощрённый садизм, чтобы обмануть его и заставить долго вычислять то, что он вычислить не может, но думает, что может. К чести калькулятора, надо сказать, что обмануть его оказалось не так уж и просто. Например, если просто попытаться посчитать несобственный интеграл или производную в точке, где она не определена, калькулятор по-быстрому выдаст "Math ERROR" и дальше вычислять откажется. Первым решением, которое пришло в голову, было подсунуть функцию, которая определена в точке дифференцирования, но имеет в ней бесконечную производную, например, кубический корень в точке 0. Опробовав этот метод, я получил наконец заветное "Time Out". Впрочем, кажется, в тот раз я особо не пытался получить конкретно эту ошибку, просто проверял, а что будет, если такое сделать. А было, вероятно, следующее: калькулятор пробовал найти приближение производной, заменяя касательную ломанной, приближая один из её концов к точке дифференцирования, в надежде, что результат будет сходиться к какому-нибудь числу. Результат же вместо этого стал получаться всё больше и больше, причём при переходе к очередной итерации расхождение с предыдущей увеличивалось всё сильнее. Калькулятору это довольно быстро надоело и он выдал Time Out.
Вторым способом применить изощрённый садизм было подсунуть калькулятору для интегрирования или дифференцирования генератор случайных чисел. И вот тут-то началось самое интересное, доказывающее, что калькулятор, каким бы он крутым ни был, всё равно, как говорил наш учитель математики, дурак. Не помню, уж какие численные методы применяются для вычисления производных и интегралов, но, кажется, все они основаны на непрерывности дифференцируемой или интегрируемой функции, т.е. на том их свойстве, что при маленьком изменении аргумента, значение функции тоже меняется мало. Обычно с этим проблем не возникает, т.к. почти все функции в калькуляторе и так непрерывны, за исключение отдельных точек, в которых они не определены. Я же подсунул ему специфическую функцию, которая не зависит от икс и при каждом своём вызове выдаёт новое значение, т.е. по сути разрывна в каждой своей точке, как функция Дирихле. И, опять же, калькулятор, видимо пытался брать точки всё ближе и ближе, в надежде что и разница в значения функции будет всё меньше и меньше и он сможет хоть как-то оценить производную или интеграл, а вместо этого получал постоянные скачки, не зависящие от значения аргумента. На этот раз он долго пытался подобрать нужное значение икс. Видимо, его обнадёживало, что скачки получались не очень большими и не возрастали, как в случае с кубическим корнем в нуле, но и тут сдался через пару минут, объявив Time Out. Понять, что его заставили заниматься бессмысленной работой, вычисляя производные и интегралы от функции, которая даже не является математической, и выдаёт случайный результат, не зависящий от x, он так и не смог.

И напоследок об ошибках, выдаваемых калькулятором смартфона. Здесь я просто не могу пройти мимо: уж слишком они забавные.

На 0 делить нельзя Это, как вы понимаете, при попытке разделить на 0. Меня просто умилила эта школьная фраза в калькуляторе. Она одна, по-моему, стоит того, чтобы о ней написать.

Неправ. выраж-е Офигенный способ сокращать, конечно. Это, как вы понимаете аналог Syntax ERROR у Casio. Приятно, что калькуляторы, наконец, доросли до того, чтобы позволять делать не только математические, но и синтаксические ошибки.

Неверный аргумент По названию, конечно, очень похоже на Argument ERROR, но на смартфоне эта ошибка гораздо чаще встречается, чем у Casio. Например, ln(0) Casio сочтёт математической ошибкой, а калькулятор смартфона - ошибкой аргумента.

Не число Эта фраза меня тоже умилила, особенно тот факт, что она получается, если, например, попытаться извлечь квадратный корень из отрицательного числа. Т.е. мнимые числа - это не числа, что ли? По-моему, это оголтелый шовинизм по отношению к мнимым числам.

Время ожидания истекло Короче, Time Out. Правда времени, почему-то проходит совсем немного прежде чем выводится эта надпись, т.е. калькулятор смартфона либо считает быстро, либо вообще не считает.

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

На этом всё, пожалуй.
Дополнен 1 год назад
Знач. не опред./=1 Да-да, именно так. Ещё одна ошибка калькулятора на телефоне, которая возникает, если попытаться 0 возвести в степень 0. Честно говоря, какой-то системы в наименовании этих ошибок не вижу.
Дополнен 11 месяцев назад
Регистрируйтесь, делитесь ссылками в соцсетях, получайте на WMZ кошелек 20 % с каждого денежного зачисления пользователей, пришедших на проект по Вашей ссылке. Подробнее
После регистрации Вы также сможете получать 100 руб за каждую тысячу уникальных поисковых переходов на Вашу статью в блоге Подробнее