– F – плавающая запятая — отсутствие фиксации запятой (выключение режима округления). Если вам не нужно округлять числа всегда ставьте переключатель в положение F.
– 0– 2– 3– 4–определяют, сколько знаков после запятой будет показывать индикатор.
– A – ADD–mode — режим «Автоматической запятой«. Этот режим удобен для тех, кто постоянно работает с деньгами, вводя целые и сотые доли единиц (рубли/копейки, доллары/центы и т. п.). В этом режиме при сложении и вычитании не нужно вводить десятичную точку. Она вводится автоматически.
Внимание: все материалы этого сайта защищены Законом об авторском праве. Запрещено любое использование материалов сайта без письменного разрешения авторов.
Использование дополнительных функций бухгалтерских микрокалькуляторов
TRICOM-199M
TRICOM 12D
Бухгалтерские микрокалькуляторы покупают, в основном, из-за их размера: большой индикатор и кнопки облегчают работу и уменьшают количество возможных ошибок при вводе данных и считывании результата.
Однако, мало кто пользуется дополнительными функциями, присущими бухгалтерским калькуляторам,
Обзор дополнительных функций я буду показывать на двух калькуляторах фирмы TRICOM: Tricom 12D и TRICOM TC-199M
Прежде всего, в бухгалтерских калькуляторах имеется «переключатель запятой«. Он может быть выполнен как обычный переключатель с положениями A, 0, 2, 4, F, так и кнопка с надписью [TAB], последовательные нажатия которой меняют соответствующий значок на индикаторе.
Что означают эти символы: во-первых, цифры 0, 2 и 4 определяют, сколько знаков после запятой будет показывать индикатор. Это сделано как для того, чтобы не отображать «лишние» цифры, так и чтобы не искать глазами запятую (она будет находиться на фиксированной позиции).
Если поставить переключатель в положение «A«, то калькулятор перейдет в режим «Автоматической запятой«. Этот режим удобен для тех, кто постоянно работает с деньгами, вводя целые и сотые доли единиц (рубли/копейки, доллары/центы и т. п.). В этом режиме при сложении и вычитании не нужно вводить десятичную точку. Она вводится автоматически, отделяя две последние введенные цифры. Например, если ввести 12345 и нажать [+], то на индикаторе появится число 123.45, соответствующее 123 рублям и 45 копейкам. Чтобы к этому числу прибавить еще три рубля вводим 300 (3 рубля 00 копеек) и нажимаем [=] (ответ: 126.45). Хочу заметить, что автоматическая запятая ставится только для сложения и вычитания чисел. При умножении и делении автоматическая запятая не ставится. Умножим наш ответ 126.45 на четыре [x] 4 = 505.80.
Как я уже говорил, при установке переключателя в положение 0, 2, 4 индикатор будет отображать соответственно 0, 2 или 4 цифры после запятой. А что происходит с оставшимися числами? Будет произведено округление или отбрасывание остальных цифр? В микрокалькуляторах предусмотрено три режима округления: нет округления (цифры будут отброшены), округление вверх (цифры будут отброшены, и к первой значимой цифре индикатора будет прибавлена единица) и режим 4/5, когда действуют правила округления (если первая отбрасываемая цифра меньше 5, то все цифры отбросятся без прибавления, а если равна или больше 5, то к первой значимой цифре индикатора будет прибавлена единица). Для установки режима имеется переключатель [стрелка вверх], [5/4], [стрелка вниз] или кнопка.
На рисунке в качестве примера показан режим отображения двух знаков после запятой и округлением в сторону увеличения.
Функция GT (Grand Total) предназначена для общего суммирования всех производимых на микрокалькуляторе операций. Значок GT появляется на индикаторе каждый раз при нажатии клавиши [=] и остается до очистки. В регистре GT суммируются все операции, производимые на микрокалькуляторе. Например, выполним следующие операции: [C] 100 [+] 200 [=] (результат: 300.) 5 [x] 6 [=] (30.) 345 [-] 123 = (222.)
Мы произвели три действия, в результате которых получались результаты 300, 30 и 222. Их сумма равна 300+30+222=552. Нажимаем клавишу [GT] и читаем с индикатора общую сумму: (552.)
При повторном нажатии клавиши [GT] происходит очистка регистра общей суммы. В зависимости от модели калькулятора возможно выключение общего суммирования (как в модели Tricom 12D). В модели Tricom 123 общее суммирование производится (на индикаторе отображается значок GT), но кнопка для вывода общей суммы не предусмотрена.
Клавиши [TAX+] [TAX-] и [RATE] предназначены для автоматического прибавления или вычитания фиксированного значения процентов для заданного числа (налогов). Если все время приходится прибавлять или вычитать фиксированное количество процентов (например, НДС 18%), то задав величину налога (RATE), при нажатии клавиш [TAX+] или [TAX-] проценты прибавятся или отнимутся автоматически.
Для задания количества процентов необходимо ввести число процентов и нажать последовательно [RATE] и [TAX+]. Введенное число будет использоваться в дальнейшем при вычислениях и не сотрется, пока вы не замените его на новое. Чтобы посмотреть записанное число процентов, нажмите [RATE] и [TAX-] (на индикаторе высветится значок TAX%).
В микрокалькуляторе TC-199M задание величины процентов задается по-другому. Там нет клавиши [RATE], вместо нее используется клавиша процентов [%], над которой имеется надпись TAX RATE SET. Если после сброса [ON/AC] нажать клавишу [%], то на экран высветится сохраненное значение процентов. Для изменения этого числа необходимо нажать клавишу [ON/AC], затем нажать и удерживать клавишу [%] (TAX RATE SET) в течение 2-х секунд. После этого ввести новое значение процентов и снова нажать клавишу [%] (TAX RATE SET).
Пример: вычислить НДС 18% для сумм 200, 500, 1000 и 10000. Сначала вводим 18% в память микрокалькулятора: 18 [RATE] [TAX+] Далее вычисляем: 200 [TAX+] (ответ: 236.) 500 [TAX+] (ответ: 590.) 1000 [TAX+] (ответ: 1180.) 10000 [TAX+] (ответ: 11800.)
Еще одной удобной функцией в микрокалькуляторе является вычисление стоимости (COST), цены при продаже (SELL) и прибыли (маржи, MARGIN). Причем можно вычислять любую величину при известных двух других. То есть можно вычислить значение прибыли при известной стоимости и продажной цены, продажную цену при известной стоимости и прибыли и стоимость при известных значениях прибыли и продажной цены.
В микрокалькуляторе TRICOM 12D это происходит следующим образом: сначала вводится первое значение, нажимается клавиша операции, потом вводится второе значение, нажимается клавиша операции, после чего на экране сразу отображается результат для третьего значения.
Пример: комиссионный магазин берет 7% от продажной стоимости товара. Мы хотим продать вещицу за 1000 рублей. Какую цену необходимо выставить в магазине? Очищаем калькулятор [C] и вводим: 1000 [COST] (вводим стоимость товара, на индикаторе мигает надпись COST) 7 [MGN] (вводим величину прибыли) На индикаторе появляется результат (1075,2688172, на индикаторе отображается надпись SELL)).
Если не выполнять дальше никаких арифметических действий, то можно повторить вычисления продажной цены для других значений прибыли, вводя числа и нажимая клавишу [MGN].
Очень часто бывает полезным проконтролировать производимые вычисления, и в случае ошибки не вводить последовательность вычислений заново, а откорректировать только одну-две операции. Для решения этой проблемы очень помогают микрокалькуляторы с контролем и коррекцией вычислений. Такие калькуляторы могут запоминать введенные числа и операции и в случае необходимости корректировать ввод и повторять расчеты. В микрокалькуляторе TRICOM 199M имеется память до 100 операций.
Как этим пользоваться? Например, вычислим формулу: (1+2*3)/4+5*6=. Последовательно введем формулу, но вместо первой единицы введем 4. [ON/AC] 4 [+] 2 [*] 3 [/] 4 [+] 5 [*] 6 [=] (ответ: 57.)
После нажатия клавиши [=] на счетчике действий показывается число 07. Нажимаем клавишу . Счетчик операций покажет 01 (первая операция), а индикатор показывает первое введенное число 4. Нам нужно изменить 4 на 1 и повторить все вычисления. Нажимаем клавишу [CORRECT], вводим число 1 и снова нажимаем [CORRECT]. Затем нажимаем клавишу и видим, что ответ 57 изменился на правильный (43.5). Таким образом мы изменили всю цепочку вычислений. Нажимая несколько раз клавиши и можно просматривать все произведенные операции, и в случае необходимости клавишей [CORRECT] внести изменения. Клавиша [AUTO REVIEW] используется для автоматической прокрутки произведенных операций с некоторой задержкой, чтобы вы могли проконтролировать свои вычисления.
Микрокалькулятор TRICOM TC-199M имеет также клавиши преобразования валют. Сначала вводится курс валюты. Нажимается [ON/AC], затем нажимается и удерживается в течение 2-х секунд клавиша [HOME] (ECXCH RATE SET), вводится курс и снова нажимается клавиша [HOME].
Для просмотра сохраненного значения курса нажимается [ON/AC] и [HOME]. При этом на индикаторе будет отображаться текущий курс и слева надпись «HM».
После задания курса можно преобразовывать. Пусть задан курс рубля к Евро (34.5). Нажимаем: 2 [HOME] (преобразуем 2 Евро в рубли и получаем 69.00). 100 [CURRENCY] (преобразуем 100 рублей в Евро и получаем 2.90).
Обратите внимание, что автоматически производится вычисление до 2-х знаков после запятой с округлением.
В рамках этой статьи объяснение этих функций заняло бы довольно много текста. Так что я записал видел и выложил его на Youtube.
В заключение хочу добавить, что в калькуляторах различных производителей выполняемые функции могут отличаться от описанных здесь. Всегда читайте инструкцию по эксплуатации к микрокалькулятору, чтобы быть уверенным в производимых вычислениях.
Что нужно знать про арифметику с плавающей запятой
В далекие времена, для IT-индустрии это 70-е годы прошлого века, ученые-математики (так раньше назывались программисты) сражались как Дон-Кихоты в неравном бою с компьютерами, которые тогда были размером с маленькие ветряные мельницы. Задачи ставились серьезные: поиск вражеских подлодок в океане по снимкам с орбиты, расчет баллистики ракет дальнего действия, и прочее. Для их решения компьютер должен оперировать действительными числами, которых, как известно, континуум, тогда как память конечна. Поэтому приходится отображать этот континуум на конечное множество нулей и единиц. В поисках компромисса между скоростью, размером и точностью представления ученые предложили числа с плавающей запятой (или плавающей точкой, если по-буржуйски).
Арифметика с плавающей запятой почему-то считается экзотической областью компьютерных наук, учитывая, что соответствующие типы данных присутствуют в каждом языке программирования. Я сам, если честно, никогда не придавал особого значения компьютерной арифметике, пока решая одну и ту же задачу на CPU и GPU получил разный результат. Оказалось, что в потайных углах этой области скрываются очень любопытные и странные явления: некоммутативность и неассоциативность арифметических операций, ноль со знаком, разность неравных чисел дает ноль, и прочее. Корни этого айсберга уходят глубоко в математику, а я под катом постараюсь обрисовать лишь то, что лежит на поверхности.
1. Основы
Множество целых чисел бесконечно, но мы всегда можем подобрать такое число бит, чтобы представить любое целое число, возникающее при решении конкретной задачи. Множество действительных чисел не только бесконечно, но еще и непрерывно, поэтому, сколько бы мы не взяли бит, мы неизбежно столкнемся с числами, которые не имеют точного представления. Числа с плавающей запятой — один из возможных способов предсталения действительных чисел, который является компромиссом между точностью и диапазоном принимаемых значений.
Число с плавающей запятой состоит из набора отдельных разрядов, условно разделенных на знак, экспоненту порядок и мантиссу. Порядок и мантисса — целые числа, которые вместе со знаком дают представление числа с плавающей запятой в следующем виде:
Математически это записывается так:
Основание определяет систему счисления разрядов. Математически доказано, что числа с плавающей запятой с базой B=2 (двоичное представление) наиболее устойчивы к ошибкам округления, поэтому на практике встречаются только базы 2 и, реже, 10. Для дальнейшего изложения будем всегда полагать B=2, и формула числа с плавающей запятой будет иметь вид:
Что такое мантисса и порядок? Мантисса – это целое число фиксированной длины, которое представляет старшие разряды действительного числа. Допустим наша мантисса состоит из трех бит (|M|=3). Возьмем, например, число «5», которое в двоичной системе будет равно 1012. Старший бит соответствует 2 2 =4, средний (который у нас равен нулю) 2 1 =2, а младший 2 0 =1. Порядок – это степень базы (двойки) старшего разряда. В нашем случае E=2. Такие числа удобно записывать в так называемом «научном» стандартном виде, например «1.01e+2». Сразу видно, что мантисса состоит из трех знаков, а порядок равен двум.
Допустим мы хотим получить дробное число, используя те же 3 бита мантиссы. Мы можем это сделать, если возьмем, скажем, E=1. Тогда наше число будет равно
Обратите внимание, что одно и то же число имеет несколько представлений. Это не удобно для оборудования, т.к. нужно учитывать множественность представлния при сравнении чисел и при выполнении над ними арифметических операций. Кроме того, это не экономично, поскольку число представлений — конечное, а повторения уменьшают множество чисел, которые вообще могут быть представлены. Поэтому уже в самых первых машинах начали использовать трюк, делая первый бит мантиссы всегда положительным. Такое предаставление назвали нормализованным.
Это экономит один бит, так как неявную единицу не нужно хранить в памяти, и обеспечивает уникальность представления числа. В нашем примере «2» имеет единственное нормализованное представление («1.000e+1»), а мантисса хранится в памяти как «000», т.к. старшая единица подразумевается неявно. Но в нормализованном представлении чисел возникает новая проблема — в такой форме невозможно представить ноль.
Строго говоря, нормализованное число имеет следующий вид:
Качество решения задач во многом зависит от выбора представления чисел с плавающей запятой. Мы плавно подошли к проблеме стандартизации такого представления.
2. Немного истории
В 60-е и 70-е годы не было единого стандарта представления чисел с плавающей запятой, способов округления, арифметических операций. В результате программы были крайне не портабельны. Но еще большей проблемой было то, что у разных компьютеров были свои «странности» и их нужно было знать и учитывать в программе. Например, разница двух не равных чисел возвращала ноль. В результате выражения «X=Y» и «X-Y=0» вступали в противоречие. Умельцы обходили эту проблему очень хитрыми трюками, например, делали присваивание «X=(X-X)+X» перед операциями умножения и деления, чтобы избежать проблем.
Инициатива создать единый стандарт для представления чисел с плавающей запятой подозрительно совпала с попытками в 1976 году компанией Intel разработать «лучшую» арифметику для новых сопроцессоров к 8086 и i432. За разработку взялись ученые киты в этой области, проф. Джон Палмер и Уильям Кэхэн. Последний в своем интервью высказал мнение, что серьезность, с которой Intel разрабатывала свою арифметику, заставила другие компании объединиться и начать процесс стандартизации.
Все были настроены серьезно, ведь очень выгодно продвинуть свою архитектуру и сделать ее стандартной. Свои предложения представили компании DEC, National Superconductor, Zilog, Motorola. Производители мейнфреймов Cray и IBM наблюдали со стороны. Компания Intel, разумеется, тоже представила свою новую арифметику. Авторами предложенной спецификации стали Уильям Кэхэн, Джероми Кунен и Гарольд Стоун и их предложение сразу прозвали «K-C-S».
Практически сразу же были отброшены все предложения, кроме двух: VAX от DEC и «K-C-S» от Intel. Спецификация VAX была значительно проще, уже была реализована в компьютерах PDP-11, и было понятно, как на ней получить максимальную производительность. С другой стороны в «K-C-S» содержалось много полезной функциональности, такой как «специальные» и «денормализованные» числа (подробности ниже).
В «K-C-S» все арифметические алгоритмы заданы строго и требуется, чтобы в реализации результат с ними совпадал. Это позволяет выводить строгие выкладки в рамках этой спецификации. Если раньше математик решал задачу численными методами и доказывал свойства решения, не было никакой гарантии, что эти свойства сохранятся в программе. Строгость арифметики «K-C-S» сделала возможным доказательство теорем, опираясь на арифметику с плавающей запятой.
Компания DEC сделала все, чтобы ее спецификацию сделали стандартом. Она даже заручилась поддержкой некоторых авторитетных ученых в том, что арифметика «K-C-S» в принципе не может достигнуть такой же производительности, как у DEC. Ирония в том, что Intel знала, как сделать свою спецификацию такой же производительной, но эти хитрости были коммерческой тайной. Если бы Intel не уступила и не открыла часть секретов, она бы не смогла сдержать натиск DEC.
Подробнее о баталиях при стандартизации смотрите в интервью профессора Кэхэна, а мы рассмотрим, как выглядит представление чисел с плавающей запятой сейчас.
3. Представление чисел с плавающей запятой сегодня
Разработчики «K-C-S» победили и теперь их детище воплотилось в стандарт IEEE754. Числа с плавающей запятой в нем представлены в виде знака (s), мантиссы (M) и порядка (E) следующим образом:
Замечание. В новом стандарте IEE754-2008 кроме чисел с основанием 2 присутствуют числа с основанием 10, так называемые десятичные (decimal) числа с плавающей запятой.
Чтобы не загромождать читателя чрезмерной информацией, которую можно найти в Википедии, рассмотрим только один тип данных, с одинарной точностью (float). Числа с половинной, двойной и расширенной точностью обладают теми же особенностями, но имеют другой диапазон порядка и мантиссы. В числах одинарной точности (float/single) порядок состоит из 8 бит, а мантисса – из 23. Эффективный порядок определяется как E-127. Например, число 0,15625 будет записано в памяти как
Рисунок взят из Википедии
3.1 Специальные числа: ноль, бесконечность и неопределенность
Неопределенность или NaN (от not a number) – это представление, придуманное для того, чтобы арифметическая операция могла всегда вернуть какое-то не бессмысленное значение. В IEEE754 NaN представлен как число, в котором E=Emax+1, а мантисса не нулевая. Любая операция с NaN возвращает NaN. При желании в мантиссу можно записывать информацию, которую программа сможет интерпретировать. Стандартом это не оговорено и мантисса чаще всего игнорируется.
Вернемся к примеру. Наш Emin=-1. Введем новое значение порядка, E=-2, при котором числа являются денормализованными. В результате получаем новое представление чисел:
Интервал от 0 до 0,5 заполняют денормализованные числа, что дает возможность не проваливаться в 0 рассмотренных выше примерах (0,5-0,25 и 1,5-1,25). Это сделало представление более устойчиво к ошибкам округления для чисел, близких к нулю.
Но роскошь использования денормализованного представления чисел в процессоре не дается бесплатно. Из-за того, что такие числа нужно обрабатывать по-другому во всех арифметических операциях, трудно сделать работу в такой арифметике эффективной. Это накладывает дополнительные сложности при реализации АЛУ в процессоре. И хоть денормализованные числа очень полезны, они не являются панацеей и за округлением до нуля все равно нужно следить. Поэтому эта функциональность стала камнем преткновения при разработке стандарта и встретила самое сильное сопротивление.
3.4 Очередность чисел в IEEE754
Одна из удивительных особенностей представления чисел в формате IEEE754 состоит в том, что порядок и мантисса расположены друг за другом таким образом, что вместе образуют последовательность целых чисел для которых выполняется:
4.2 Неассоциативность арифметических операций
В арифметике с плавающей запятой правило (a*b)*c = a*(b*c) не выполняется для любых арифметических операций. Например,
Допустим у нас есть программа суммирования чисел.
Некоторые компиляторы по умолчанию могут переписать код для использования нескольких АЛУ одновременно (будем считать, что n делится на 2):
Так как операции суммирования не ассоциативны, эти две программы могут выдать различный результат.
4.3 Числовые константы
Помните, что не все десятичные числа имеют двоичное представление с плавающей запятой. Например, число «0,2» будет представлено как «0,200000003» в одинарной точности. Соответственно, «0,2 + 0,2 ≈ 0,4». Абсолютная погрешность в отдельном случае может и не высока, но если использовать такую константу в цикле, можем получить накопленную погрешность.
4.4 Выбор минимума из двух значений
4.5 Сравнение чисел
Очень распространенная ошибка при работе с float-ами возникает при проверке на равенство. Например,
Ошибка здесь, во-первых, в том, что 0,2 не имеет точного двоичного представления, а во-вторых 0,2 – это константа двойной точности, а переменная fValue – одинарной, и никакой гарантии о поведении этого сравнения нет.
Лучший, но все равно ошибочный способ, это сравнивать разницу с допустимой абсолютной погрешностью:
Недостаток такого подхода в том, что погрешность представления числа увеличивается с ростом самого этого числа. Так, если программа ожидает «10000», то приведенное равенство не будет выполняться для ближайшего соседнего числа (10000,000977). Это особенно актуально, если в программе имеется преобразование из одинарной точности в двойную.
Выбрать правильную процедуру сравнения сложно и заинтересованных читателей я отсылаю к статье Брюса Доусона. В ней предлагается сравнивать числа с плавающей запятой преобразованием к целочисленной переменной. Это — лучший, хотя и не портабельный способ:
5. Проверка полноты поддержки IEE754
Думаете, что если процессоры полностью соответствуют стандарту IEEE754, то любая программа, использующая стандартные типы данных (такие как float/double в Си), будет выдавать один и тот же результат на разных компьютерах? Ошибаетесь. На портабельность и соответствие стандарту влияет компилятор и опции оптимизации. Уильям Кэхэн написал программу на Си (есть версия и для Фортрана), которая позволяет проверить удовлетворяет ли связка «архитектура+компилятор+опции» IEEE754. Называется она «Floating point paranoia» и ее исходные тексты доступны для скачивания. Аналогичная программа доступна для GPU. Так, например, компилятор Intel (icc) по умолчанию использует «расслабленную» модель IEEE754, и в результате не все тесты выполняются. Опция «-fp-model precise» позволяет компилировать программу с точным соответствием стандарту. В компиляторе GCC есть опция «-ffast-math», использование которой приводит к несоответствию IEEE754.
Заключение
Напоследок поучительная история. Когда я работал над тестовым проектом на GPU, у меня была последовательная и параллельная версия одной программы. Сравнив время выполнения, я был очень обрадован, так как получил ускорение в 300 раз. Но позже оказалось, что вычисления на GPU «разваливались» и обращались в NaN, а работа с ними в GPU была быстрее, чем с обычными числами. Интересно было другое — одна и та же программа на эмуляторе GPU (на CPU) выдавала корректный результат, а на самом GPU – нет. Позже оказалось, что проблема была в том, что этот GPU не поддерживал полностью стандарт IEEE754 и прямой подход не сработал.
Сейчас арифметика с плавающей запятой почти совершенна. Практически всегда наивный подход сработает, и программа, не учитывающая все ее особенности, выдаст правильный результат, а описанные подводные камни касаются только экзотических случаев. Но нужно всегда оставаться бдительным: в таком вопросе как компьютерная математика легко наступить на грабли.