Как называется характеристика процессора, определяющая максимальное количество двоичных разрядов

Обновлено: 21.11.2024

Числа с плавающей запятой

Вещественные числа: пи = 3,14159265. e = 2,71828.

Научная запись: одна цифра слева от десятичной точки.

Число в научной нотации без ведущих нулей называется нормализованным числом: 1,0 × 10 -8

Не в нормализованной форме: 0,1 × 10–7 или 10,0 × 10–9

Также может представлять двоичные числа в экспоненциальном представлении: 1,0 × 2 -3

Компьютерная арифметика, поддерживающая такие числа, называется операциями с плавающей запятой.

Форма 1.xxxx × 2 yy

Использование нормализованной экспоненциальной записи

Представление чисел с плавающей запятой

Номер битаРазмерИмя поля
311 бит Знак (S)
23-308 битЭкспонента (E)
0-2223 битаМантисса (M)
< /p>

Число одинарной точности с плавающей запятой занимает 32 бита, поэтому существует компромисс между размером мантиссы и размером экспоненты.

Эти выбранные размеры обеспечивают диапазон приблизительно:

Чтобы уменьшить вероятность недополнения/переполнения, можно использовать 64-разрядную арифметику с двойной точностью

Номер битаРазмерИмя поля
631 бит Знак (S)
52-6211 битЭкспонента (E)
0-5152 битаМантисса (M)
< /p>

предоставление диапазона приблизительно

Эти форматы называются .

Стандарт IEEE 754 с плавающей запятой

Поскольку мантисса всегда равна 1.xxxxxxxxx в нормализованной форме, нет необходимости представлять начальный 1. Итак, эффективно:

Поскольку ноль (0.0) не имеет ведущей 1, чтобы отличить его от других, ему присваивается зарезервированный битовый шаблон со всеми 0 для показателя степени, чтобы аппаратное обеспечение не добавляло к нему ведущую 1. Таким образом:

Если мы пронумеруем биты мантиссы слева направо m1, m2, m3, .

мантисса = m1 × 2–1 + m2 × 2–2 + m3 × 2–3 + .

Отрицательные показатели степени могут вызвать проблемы при сравнении.

Например (с дополнением до двух):

< td>0000000 00000000 00000000
ЗнакПоказатель степениМантисса
1,0 × 2 -1 0111111110000000 00000000 00000000
1,0 × 2 +1 000000001

При таком представлении первая экспонента показывает "большее" двоичное число, что затрудняет прямое сравнение.

Чтобы избежать этого, для экспоненты используется предвзятая нотация.

Если реальный показатель числа равен X, то он представляется как (X + смещение)

Для одинарной точности IEEE используется смещение 127. Таким образом, показатель степени

-1 представлен как -1 + 127 = 126 = 011111102
0 представляется как 0 + 127 = 127 = 01111111< sub>2
+1 представляется как +1 + 127 = 128 = 100000002
+5 представляется как +5 + 127 = 132 = 10000100 2

Итак, фактическая экспонента находится путем вычитания смещения из сохраненной экспоненты. Следовательно, при данных полях S, E и M число с плавающей запятой IEEE имеет значение:

(Помните: это (1.0 + 0.M), потому что в нормализованной форме необходимо хранить только дробную часть мантиссы)

Сложение с плавающей запятой

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

8,70 × 10 -1 с 9,95 × 10 1

10,037 × 10 1 = 1,0037 × 10 2 (сдвиг мантиссы, корректировка степени)

проверить переполнение/недостаточное значение показателя степени после нормализации

Если мантисса не помещается в отведенное для нее место, ее необходимо округлить.

Например: если для мантиссы разрешено только 4 цифры

(есть только скрытый бит с двоичными числами с плавающей запятой)

10 000 x 10^1 = 1 000 x 10^2 -->

Пример добавления в двоичном формате

0,5 = 0,1 × 2 0 = 1,000 × 2 -1 (нормировано)

-0,4375 = -0,0111 × 2 0 = -1,110 × 2 -2 (нормализовано)

0,001 × 2 -1 = 1.000 × 2–4

Сумма умещается в 4 бита, поэтому округление не требуется

Умножение с плавающей запятой

Умножьте вручную следующие два числа в экспоненциальном представлении:

1,110 × 10 10 × 9,200 × 10 -5

Новый показатель степени = 10 + (-5) = 5

(10 + 127) + (-5 + 127) = 259

1,110 × 9,200 = 10,212000

Можно оставить только три цифры справа от запятой, поэтому результат будет

Вот своего рода глоссарий компьютерных модных словечек, с которыми вы столкнетесь при использовании компьютера:

Бит
Компьютерные процессоры могут только сказать, включен провод или нет. К счастью, они могут просматривать множество проводов одновременно (см. шину) и довольно изощренно реагировать на сложную последовательность включений и отключений. Чтобы преобразовать эти шаблоны во что-то, что имеет смысл для людей, мы рассматриваем провод, который включен, как «1», а провод, который выключен, - как «0». Затем мы можем посмотреть на провода, ведущие к компьютеру, и прочитать что-то вроде 00110111 00010000. Мы не знаем, что это представляет для процессора, это просто шаблон. Каждое место в шаблоне — это бит, который может быть равен 1 или 0. Если это означает число для процессора, биты составляют двоичное число.

Двоичные числа
В наши дни большинство из нас считает десятками. В древних культурах считали 5, 12 или 24, но за последнюю тысячу лет счет десятками стал нормой. когда вы видите число 145, вы просто знаете, что оно включает в себя одну группу из десяти десятков, плюс четыре группы из десяти и еще пять. Десять десятков это сто или десять в квадрате. Десять сотен — это тысяча, или десять в третьей. Здесь есть закономерность. Каждая цифра представляет собой количество десятков, возведенное в степень положения цифры, при условии, что вы начинаете счет с нуля и считаете справа налево.

Если вы проделаете то же самое с битами, которые могут быть только 1 или 0, каждая позиция в списке битов представляет некоторую степень двойки. 1001 означает одна восьмерка плюс ни одной четверки плюс ни одной двойки плюс еще одна. Это называется двоичной записью. Вы можете преобразовывать числа из двоичной записи в десятичную, но это требуется редко.

Байты
Числа вроде 00110111 10110000 намного легче читать, если вы ставите пробелы через каждые 8 ​​бит. В десятичном представлении мы используем запятые через каждые три цифры по той же причине. В 8 битах нет ничего особенного, просто так все началось. Фурнитура проще собрать, если вы сгруппируете провода последовательно от одной части к другой. Некоторое старое оборудование группировало провода по 10, но в 70-х идея работы группами по 8 действительно преобладала, особенно при разработке интегральных схем. Кто-то пошутил о группе, переносящей байт данных, и термин прижился. Иногда можно услышать группу из четырех битов, называемую полубайтом.

Самое большое число, которое можно представить с помощью 8 бит, — 1 111 1111, или 255 в десятичной системе счисления. Поскольку 00000000 является наименьшим, вы можете представить 256 элементов с помощью байта. (Помните, укус — это просто шаблон. Он может представлять собой букву или оттенок зеленого.) Биты в байте имеют числа. Крайний правый бит — это бит 0, а левый — бит 7. Эти два бита также имеют имена. Самый правый - это младший значащий бит или младший бит. Он наименее значим, потому что его изменение оказывает наименьшее влияние на значение. Какой мсб? (Байты в больших числах также можно назвать наименее значимыми и наиболее значимыми.)

Шестнадцатеричные числа
Даже с пробелом 00110111 10110000 довольно сложно прочитать. Разработчики программного обеспечения часто используют код, называемый шестнадцатеричным, для представления двоичных шаблонов. Шестнадцатеричная система была создана путем преобразования десятичной системы счисления в двоичную и наоборот. Кто-то добавил шесть цифр к обычным числам от 0 до 9, чтобы число до 15 можно было представить одним символом. Поскольку их нужно было набирать на обычной клавиатуре, использовались буквы A-F. Один из них может представлять собой четыре бита, поэтому байт записывается в виде двух шестнадцатеричных цифр. 00110111 10110000 становится 37B0.

Вот удобная таблица:
Шестнадцатеричный двоичный десятичный
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
А 1010 10
Б 1011 11 < br />C 1100 12
D 1101 13
E 1110 14
F 1111 15

При использовании трех разных схем легко спутать числа. 1000 можно перевести как тысяча, восемь или четыре тысячи девяносто шесть. Вы должны указать, какую систему вы используете. Тот факт, что вы все еще иногда видите устаревшую систему, называемую восьмеричной (цифры 0-7. Вы можете это понять), увеличивает вероятность путаницы. Шестнадцатеричные числа можно указать, написав их 1000hex 1000h или 0x1000. Двоичные числа можно записать 1000bin. Восьмеричные числа были просто записаны с дополнительным ведущим 0. Десятичные числа не указываются, за исключением случаев, когда существует вероятность путаницы, например, один на странице шестнадцатеричных чисел.

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

В компьютерной инженерии понятие шины было расширено до обозначения группы проводов, по которым передаются данные по системе. Обычно проводов достаточно для обработки от одного до четырех байтов. Размер этих шин оказывает большое влияние на эффективность системы. 32-битная шина может обрабатывать числа в два раза длиннее (то есть от 2 до 16 больше), чем 16-битная шина.

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

Память
Компьютер был бы бесполезен, если бы не мог хранить данные. За прошедшие годы было много схем для хранения данных, но то, как это делается сегодня, включает в себя подключение транзисторов, чтобы они оставались включенными, когда они включены, и оставались выключенными, когда выключались. Затем транзистор может хранить бит. Транзисторы организованы в группы по 8, поэтому каждая группа может хранить байт. В одной интегральной схеме могут быть миллионы таких групп.

Каждый член группы подключен к одному проводу шины данных. Группа может быть проинструктирована некоторыми другими проводами скопировать состояние шины или подключить свои выходы к шине, чтобы шина отражала то, что находится в этой группе. Эти другие провода на самом деле являются второй шиной, называемой адресной шиной. Управляя адресной шиной, центральный процессор может выбирать, какую конкретную группу транзисторов (или ячейку памяти) считывать или модифицировать. Количество проводов в адресной шине определяет, сколько ячеек памяти она может адресовать.

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

Еще один тип памяти называется ПЗУ и предназначен для чтения только для чтения. Существуют различные типы этого, но наиболее распространенным является набор предохранителей. Все, что сгорело, представляет собой 0. Ничто не может изменить то, что находится в постоянной памяти, поэтому любая программа или данные в ней доступны, как только компьютер включен.

Диски
Поскольку память очищается при отключении питания, должна быть какая-то механическая система для хранения данных между заданиями. Носитель, используемый для хранения данных, может варьироваться от магнитной ленты до оптических дисков, а некоторые устройства позволяют легко извлекать и заменять носитель. В большинстве этих систем хранения данных используются какие-либо вращающиеся диски. Существует сложная схема отслеживания данных на диске: байты сгруппированы в блоки, блоки в файлы, файлы в каталоги (или папки), а каталоги в разделы (или тома). Пользователь вообще видит только файлы и выше.
Центральный процессор
Центральный процессор или центральный процессор — это сердце компьютера. ЦП считывает инструкцию из памяти (инструкции представляют собой битовые комбинации, как и все остальное), выполняет ее и ищет следующую инструкцию. Инструкции — это простые вещи, такие как копирование значения из памяти. ЦП имеет свои собственные ячейки памяти, называемые регистрами. Специальное оборудование позволяет складывать или вычитать регистры друг из друга. Чтобы сложить два числа, ЦП должен выбрать первое число и поместить его в регистр, выбрать другое число и поместить его в другой регистр, сложить два регистра и поместить результат обратно в память. Каждая из этих операций требует инструкции.
Часы
К счастью, ЦП может делать все это очень быстро. Вся операция управляется схемой генератора, называемой системными часами, которая работает с частотой в миллионы герц (циклов в секунду). Было бы просто думать, что один тактовый цикл означает одну инструкцию, но инструкции различаются по сложности и занимают от 4 до 20 циклов. Операции еще больше замедляются из-за памяти, которая не справляется. Некоторые ЦП имеют сверхскоростную память, называемую кешем, в которой числа, которые необходимы часто, могут храниться и извлекаться быстрее.

Периферийные устройства
ЦП взаимодействует с памятью через адресную шину и шину данных. Для связи с остальным миром используются другие автобусы. (Места, к которым могут подключаться внешние устройства, иногда называют портами.) Эти шины могут быть общими или подсоединены к одному устройству. Они могут быть последовательными или многопроводными, называемыми параллельными. Устройства, подключенные к системе, называются периферийными устройствами; сюда входят клавиатуры, мониторы, мыши, графические планшеты, принтеры, MIDI-системы и многое другое.Каждый из них имеет свои собственные данные и электрические характеристики, но соединение в порту должно быть достаточно стандартизировано, чтобы обеспечить взаимозаменяемость подобных устройств. Ниже приведены виды соединений, используемые в различных системах.

Параллельный порт
Это старый стандарт, изначально разработанный для принтеров, поэтому его часто называют портом принтера, хотя сюда можно подключать другие вещи и принтеры можно подключать другими способами. Что касается портов данных, этот довольно медленный.
IDE/ATA
Это параллельная шина, предназначенная для устройств хранения больших объемов данных. Обычно он спрятан внутри коробки, так как используемые разъемы не очень прочные. В шине IDE есть провода, которые выбирают, какое устройство активно, поэтому логическое расположение устройства (диск A, B и т. д.) зависит от того, к какому разъему оно подключено.

SCSI
Это еще один тип параллельной шины для хранения больших объемов данных. Механически он намного прочнее, чем IDE, поэтому его часто используют между коробками. SCSI — это развивающийся стандарт, который периодически адаптируется для работы на более высоких скоростях. SCSI поддерживает семь устройств на шине, и каждое из них должно иметь уникальный идентификационный номер, установленный на задней панели.

SVGA
Это тип видеоразъема. Это один из многих, но сейчас самый распространенный.

Коммуникационный порт
Это тип последовательного порта, который существует уже несколько десятилетий. Другое его название — RS-232, название технического документа, описывающего, как это должно работать. Это самый медленный порт из всех. Сюда подключаются только очень простые устройства.

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

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

USB
USB — это новая высокоскоростная последовательная система. Он рассчитан на 128 устройств и позволяет подключать устройства без отключения питания. (Возможность возиться с IDE или SCSI при включенном питании может привести к повреждению.)

Firewire
Firewire, также известный как IEEE 1394, представляет собой еще более быструю последовательную систему. Он также более надежен, чем USB, по целому ряду причин. Между FireWire и SCSI идет соревнование, кто быстрее. FireWire определенно удобнее.

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

Один драйвер MAX72XX может управлять 64 светодиодами. Библиотека поддерживает до 8 драйверов MAX72XX с последовательным подключением. Для большинства целей управления 512 светодиодами должно быть более чем достаточно.

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

Инициализация библиотеки

Чтобы включить библиотеку в код Arduino, вам нужно написать несколько строк кода инициализации.

Добавьте библиотеку в свой эскиз

Это работает так же, как и с любой другой библиотекой Arduino, вы можете либо использовать функцию меню Include Library из IDE, либо просто добавить

утверждение в верхней части эскиза.

Создайте переменную LedControl

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

Типичный код для инициализации библиотеки выглядит следующим образом:

Код инициализации для переменной, через которую мы взаимодействуем с устройствами MAX72XX, принимает 4 аргумента. Первые 3 аргумента — это номера контактов Arduino, которые подключены к MAX72XX. Это может быть любой из цифровых выводов ввода-вывода на Arduino. В примере контакты 12, 11 и 10 выбраны произвольно. Код библиотеки никаким образом не проверяет правильность номеров выводов на действительность. Ввод чего-то глупого (контакт 123 ??) или просто неправильный номер контакта нарушит код без уведомления или сообщений об ошибках. Вам не нужно инициализировать контакты ввода-вывода в качестве выходов или устанавливать для них определенное состояние, библиотека сделает это за вас.

Четвертый аргумент LedControl(dataPin,clockPin,csPin,numDevices) — это количество подключенных каскадом устройств MAX72XX, которые вы используете с этим LedControl.Библиотека может адресовать до 8 устройств из одной LedControl-переменной. С каждым устройством, которое вы добавляете в цепочку, подразумевается небольшое снижение производительности, но объем памяти, используемый кодом библиотеки, останется прежним, независимо от того, сколько устройств вы установите. Поскольку один LedControl не может адресовать более 8 устройств, здесь разрешены только значения от 1 до 8.

Если ваш эскиз должен управлять более чем 8 MAX72XX, необходимо создать другую переменную LedControl, которая использует 3 разных контакта на вашей плате Arduino.

Получить количество подключенных устройств

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

Эта функция используется для циклического просмотра всего списка подключенных устройств MAX72XX. Вот фрагмент кода, который переключает все устройства MAX72XX из режима энергосбережения в нормальный режим работы. Идея этого кода должна быть ясна, хотя функция shutdown(addr) будет представлена ​​позже.

Мы перебираем список устройств по индексу, который начинается от 0 до getDeviceCount()-1 . Индекс — это адрес каждого устройства. Этот адрес является первым аргументом каждой функции, которая устанавливает функцию или значение (индикатора) на устройстве. Обратите внимание, что getDeviceCount() возвращает количество подключенных устройств, но адрес устройства начинается с 0 для первого и 1 для второго. getDeviceCount()-1 для последнего.

Режим энергосбережения

Светодиоды потребляют довольно много энергии, когда они горят. Устройствам с батарейным питанием нужен способ экономии энергии за счет отключения всего дисплея, когда он не нужен пользователю. MAX72XX поддерживает режим отключения питания.

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

Вот прототип метода LedControl.shutdown(addr,status)

Примечание. MAX72XX всегда находится в режиме отключения при включении питания Arduino.

Ограничение количества цифр (ScanLimit)

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

Когда создается новый LedControl, он активирует все 8 цифр на всех устройствах. Каждая светящаяся цифра будет включена на 1/8 секунды схемой мультиплексора, которая управляет цифрами. Если у вас есть причина ограничить количество сканируемых цифр, светодиоды будут включаться чаще и, следовательно, будут гореть дольше.

Эффект установки предела сканирования на 4 заключается в том, что горящий светодиод теперь включается на 1/4 секунды вместо стандартной 1/8 секунды. MAX72XX должен обеспечивать ток на драйвере сегмента в течение более длительного периода времени.

Вам следует внимательно прочитать соответствующий раздел технического описания MAX72XX! На самом деле можно вывести из строя MAX72XX, выбрав неправильную комбинацию резисторов RSet, которые ограничивают ток, проходящий через светодиоды, и количество цифр, сканируемых устройством. Единственная причина, по которой вообще можно настроить ограничение сканирования, заключается в том, что дисплей выглядит слишком темным. Но это, скорее всего, из-за того, что не была поднята интенсивность при запуске. Вот прототип setScanLimit() для тех, кому это нужно:

Настройка яркости дисплея

Есть три фактора, которые определяют яркость дисплея.

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

С помощью метода setIntensity(int addr, int Intensity) яркость светодиодов можно установить за 16 дискретных шагов (0..15). Более высокие значения делают дисплей ярче. Значения больше 15 будут отброшены без изменения яркости. Даже самое низкое значение 0 не выключит дисплей полностью.

Инициализация устройства

При создании нового LedControl библиотека инициализирует оборудование с помощью

  • экран очистился
  • установлена ​​минимальная интенсивность
  • устройство в режиме энергосбережения
  • максимальное количество цифр на активированном устройстве

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

Светодиодная матрица

После всего кода инициализации пришло время управлять некоторыми светодиодами.

Очистка дисплея

Название функции LedControl.clearDisplay(addr) уже предполагает, что она делает.

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

Управление одним светодиодом

Это прототип функции, которая включает или выключает один светодиод.

Идея аргументов адреса и состояния должна быть ясна, но на что ссылаются аргументы строки и столбца? Это зависит от проводки между MAX72XX и вашей матрицей. Библиотека LedControl предполагает настройку, используемую на этой схеме:

В матрице 8 строк (с индексом от 0 до 7) и 8 столбцов (с индексом от 0 до 7). Если необходимо зажечь светодиод, расположенный в самом правом углу 3-го ряда сверху, в качестве аргументов строки и столбца необходимо использовать индекс светодиода 2.7.

В этом фрагменте кода показано, как мало светодиодов установлено на первом устройстве MAX72XX

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

Управление строкой матрицы

Функция setRow(addr,row,value) принимает 3 аргумента. Первый — это уже знакомый адрес устройства. Вторая — это строка, которую нужно обновить, а третья — значение, которое нужно установить для этой строки.

Например, светодиоды, отмеченные красным, должны быть включены, а все остальные выключены.

Индекс обновляемой строки равен 2 (считается сверху). Аргумент value должен быть установлен в значение байта, чтобы светодиоды зажглись. Самый простой способ — включить стандартный заголовочный файл в свой скетч. Значение записывается в двоичном коде и представляет собой точное соответствие между битами, установленными в 1, и светодиодами, которые необходимо включить.

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

< th>Led2.4 td> < td>16
Led2.0 Led2.1 Led2.2 Led2.3 Led2.5 Led2.6 Led2.7
Битовое значение 128 64 32 16 8< /td> 4 2 1
Светодиод горит? ДаНет Да Да Нет Нет Нет Нет
Значение строки 128 0 32 0 0 2 0

Выражение lc.setRow(0,2,176) обновляет третью строку первого MAX72XX, подключенного к Arduino.

Очевидно, что вызов setRow() намного быстрее, чем восьмикратный вызов setLed() для всех светодиодов подряд. Аппаратное обеспечение MAX72XX также приводит к тому, что функция setRow() работает в 8 раз быстрее, чем функция setColumn(), представленная в следующем разделе. Если производительность кода скетча является важным фактором, используйте функцию setRow() везде, где это возможно.

Прототип функции

Управление столбцом матрицы

Функция setColumn() работает так же, как и команда setRow(), но обновляет 8 светодиодов в вертикальном столбце.

Опять же, светодиоды, отмеченные красным, должны быть включены, а все остальные выключены.

На этот раз должны загореться 4 светодиода в нижней части столбца 6. При двоичном кодировании крайний левый бит значения относится к светодиоду в верхней части столбца.

Таблица, подобная таблице из раздела setRow(), помогает, если двоичное кодирование значения невозможно.

< th>Led2.4 < td>Нет
Led2.0 Led2.1 Led2.2 Led2.3 Led2.5 Led2.6 Led2.7
Битовое значение 128 64 32< /td> 16 8 4 2 1
Светодиод горит Да Нет Да Да Нет Нет Нет
Row-Value 128 0 32 16 0 0 2 0

Прототип функции:

Управление 7-сегментными дисплеями

Печать чисел на 7-сегментном дисплее

Семисегментный дисплей чаще всего используется для печати чисел. В библиотеке LedControl есть функция, которая просто принимает аргумент типа byte и печатает соответствующую цифру в указанном столбце. Допустимые значения для цифры от 0 до 15, что позволяет отображать шестнадцатеричные значения. Значения больше 15 (или отрицательные значения) автоматически отбрасываются. Функция также предоставляет аргумент для включения или выключения десятичной точки в столбце.

Вот фрагмент кода, который выводит значение int (-999..999) на дисплей с 4 цифрами.

Прототип функции:

Аргумент digit должен находиться в диапазоне от 0 до 7, поскольку MAX72XX может отображать до восьми цифр на 7-сегментном дисплее.

Печать символов на 7-сегментном дисплее

Существует ограниченный набор символов, которые имеют (визуальный) смысл на 7-сегментном дисплее. Обычно используется символ - для добавления отрицательных значений и 6 символов от "A" до "F" для целых шестнадцатеричных значений.

Функция setChar(addr,digit,value,dp) принимает значение типа char для диапазона 7-битной кодировки ASCII. Поскольку распознаваемые шаблоны ограничены, большинство определенных символов будут печатать -char. Но есть довольно много символов, которые имеют смысл на 7-сегментном дисплее.

Вот набор печатных символов:

  • 0 1 2 3 4 5 6 7 8 9
  • A a (в верхнем регистре)
  • B b (печатает строчными буквами)
  • C c (печатает нижний регистр)
  • D d (печатает строчными буквами)
  • E e (печать в верхнем регистре)
  • F f (печать в верхнем регистре)
  • H h (печатает верхний регистр)
  • L l (печатает верхний регистр)
  • P p (печатает верхний регистр)
  • - (знак минус)
  • <ли>. , (загорается десятичная точка)
  • _ (знак подчеркивания)
  • (пробел или пробел)

Шестнадцатеричные символы ( 0..F ) были переопределены на значения символов 0x00. 0x0F. Это позволяет смешивать значения цифр и символов. Значение байта для функции setDigit() может использоваться с setChar() и будет печатать шестнадцатеричное представление значения.

Прототип функции очень похож на прототип для отображения цифр.

Демонстрации библиотеки

Библиотека поставляется с тремя хорошо задокументированными демонстрационными эскизами. Показаны основные методы управления светодиодной матрицей, 7-сегментным дисплеем и доступом к последовательно подключенным устройствам MAX72XX. Демонстрации могут стать хорошей отправной точкой для написания собственных эскизов.

В этой главе обсуждается арифметическая модель, указанная в стандарте ANSI/IEEE 754-1985 для двоичных арифметических операций с плавающей запятой ("стандарт IEEE" или "IEEE 754" для краткости). Все процессоры SPARC и x86 используют арифметику IEEE. Все компиляторы Sun поддерживают функции арифметики IEEE.

Арифметическая модель IEEE

В этом разделе описывается спецификация IEEE 754.

Что такое арифметика IEEE?

  • Два основных формата с плавающей запятой: одинарное и двойное. Единый формат IEEE имеет значимую точность 24 бита и занимает в целом 32 бита. Двойной формат IEEE имеет значащую точность 53 бита и в целом занимает 64 бита.
  • Два класса расширенных форматов с плавающей запятой: одинарный расширенный и двойной расширенный. Стандарт не предписывает точную точность и размер этих форматов, но определяет минимальную точность и размер. Например, двойной расширенный формат IEEE должен иметь значащую точность не менее 64 бит и занимать не менее 79 бит в целом.
  • Требования к точности операций с плавающей запятой: сложение, вычитание, умножение, деление, квадратный корень, остаток, округление чисел в формате с плавающей запятой до целых значений, преобразование между различными форматами с плавающей запятой, преобразование между числами с плавающей запятой точки и целочисленные форматы и сравнение. Остаток и операции сравнения должны быть точными. Каждая из других операций должна доставить в место назначения точный результат, если только такого результата нет или этот результат не соответствует формату места назначения. В последнем случае операция должна минимально изменить точный результат в соответствии с правилами предписанных режимов округления, представленных ниже, и доставить измененный таким образом результат в пункт назначения операции.
  • Требования к точности, монотонности и идентичности для преобразования между десятичными строками и двоичными числами с плавающей запятой в любом из основных форматов с плавающей запятой. Для операндов, лежащих в указанных диапазонах, эти преобразования должны давать точные результаты, если это возможно, или минимально изменять такие точные результаты в соответствии с правилами предписанных режимов округления. Для операндов, не попадающих в указанные диапазоны, эти преобразования должны давать результаты, отличающиеся от точного результата не более чем на указанный допуск, который зависит от режима округления.
  • Пять типов исключений IEEE с плавающей запятой и условия для указания пользователю возникновения исключений этих типов. Существует пять типов исключений с плавающей запятой: недопустимая операция, деление на ноль, переполнение, потеря значимости и неточная операция
  • .
  • Четыре направления округления: к ближайшему представимому значению, при этом предпочтительны "четные" значения, когда есть два ближайших представимых значения; в сторону отрицательной бесконечности (вниз); в сторону положительной бесконечности (вверх); и к 0 (отрезать).
  • Точность округления; например, если система выдает результаты в двойном расширенном формате, пользователь должен иметь возможность указать, что такие результаты должны быть округлены до точности одинарного или двойного формата.

Форматы IEEE

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

Форматы хранения

Формат с плавающей запятой – это структура данных, определяющая поля, содержащие числа с плавающей запятой, расположение этих полей и их арифметическую интерпретацию. Формат storage с плавающей запятой указывает, как формат с плавающей запятой хранится в памяти. Стандарт IEEE определяет форматы, но оставляет за разработчиками выбор форматов хранения.

Программное обеспечение на языке ассемблера иногда полагается на использование форматов хранения, но языки более высокого уровня обычно имеют дело только с лингвистическими понятиями плавающей запятой. типы данных точек. Эти типы имеют разные имена на разных языках высокого уровня и соответствуют форматам IEEE, как показано в ТАБЛИЦЕ 2-1.

ТАБЛИЦА 2-1 Форматы и типы языков IEEE

Единый формат

Двойной формат

Двойной формат IEEE состоит из трех полей: 52-битная дробь f ; 11-битный экспонент со смещением, e ; и 1-битный знак, s . Эти поля хранятся последовательно в двух последовательно адресуемых 32-битных словах, как показано на РИС. 2-2.

В архитектуре SPARC 32-битное слово старшего адреса содержит младшие 32 бита дроби. , тогда как в архитектуре x86 32-битное слово младшего адреса содержит 32 младших бита дроби.

Если обозначить f [31:0] младшие 32 бита дроби, то бит 0 — это младший значащий бит всей дроби, а бит 31 — старший из 32 младших значащих битов дроби.

В другом 32-битном слове биты 0:19 содержат 20 старших битов. дроби, f [51:32], где бит 0 является младшим из этих 20 битов старшей дроби, а бит 19 является старшим битом всей дроби; биты 20:30 содержат 11-битовую экспоненту со смещением, e , где бит 20 является младшим битом экспоненты со смещением, а бит 30 является старшим; а старший бит 31 содержит бит знака s .

РИСУНОК 2-2 нумерует биты, как если бы два смежных 32-битных слова были одним 64-битным словом, в котором биты 0:51 хранят 52-битная дробь, f ; биты 52:62 хранят 11-битную экспоненту со смещением, e ; а бит 63 хранит бит знака, s .


РИСУНОК 2-2 Формат двойного хранения

Значения битовых комбинаций в этих трех полях определяют значение, представленное общей битовой комбинацией.< /p>

Таблица 2-4 показывает соответствие между значениями битов в трех составляющих полях, с одной стороны, и значением, представленным битовым шаблоном двойного формата, с другой; u означает не важно, потому что значение указанного поля не имеет отношения к определению значения для конкретного битового шаблона в двойном формате.

ТАБЛИЦА 2-4 Значения, представленные битовыми шаблонами в двойном формате IEEE

Двойной расширенный формат (SPARC)

Двойной расширенный формат (x86)

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

В этом разделе рассматриваются понятия диапазона и точности для заданного формата хранения. Он включает диапазоны и точности, соответствующие одинарному и двойному форматам IEEE, а также реализациям двойного расширенного формата IEEE в архитектурах SPARC и x86. Для конкретности при определении понятий диапазона и точности мы ссылаемся на единый формат IEEE.

Стандарт IEEE указывает, что 32 бита должны использоваться для представления числа с плавающей запятой в едином формате.Поскольку существует только конечное число комбинаций из 32 нулей и единиц, только конечное число чисел может быть представлено 32 битами.

Один естественный вопрос:

Каковы десятичные представления наибольшего и наименьшего положительные числа, которые могут быть представлены в этом конкретном формате?

Перефразируйте вопрос и введите понятие диапазона:

Каков диапазон в десятичном представлении чисел, которые могут быть представлены в едином формате IEEE?

Принимая во внимание точное определение единого формата IEEE, можно доказать, что диапазон чисел с плавающей запятой, которые могут быть представлены в едином формате IEEE (при ограничении положительными нормализованными числами), следующий:

1,175 . × (10 -38 ) до 3,402. × (10 +38 )

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

Стандарт IEEE для двоичной арифметики с плавающей запятой определяет набор числовых значений, представляемых в едином формате. Помните, что этот набор числовых значений описывается как набор двоичных чисел с плавающей запятой. Мантисанда единого формата IEEE имеет 23 бита, что вместе с неявным начальным битом дает 24 цифры (бита) (двоичной) точности.

Другой набор числовых значений можно получить, пометив числа :

x = (x1.x2 x3. xq) × (10 n )

(представляется q десятичными цифрами в мантиссе) на числовой прямой.

РИСУНОК 2-5 иллюстрирует эту ситуацию:


РИСУНОК 2-5 Сравнение набора чисел, определяемых цифровым и двоичным представлением

Обратите внимание, что эти два набора различны. Следовательно, оценка количества значащих десятичных цифр, соответствующих 24 значащим двоичным цифрам, требует переформулировки задачи.

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

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

Рассмотреть Некоторые примеры. Предположим, вы пытаетесь представить число в следующем десятичном представлении в едином формате IEEE:

x = x1.x2 x3. × 10 n

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

y = 838861,2, z = 1,3

и запустите следующую программу на Фортране:

Выход из этого программа должна быть похожа на:

Разница между значением 8,388612 × 10 5 , присвоенным y, и напечатанным значением составляет 0,000000125, что на семь десятичных порядков меньше, чем < эм>г . Точность представления y в едином формате IEEE составляет от 6 до 7 значащих цифр, или что y имеет около шести значащих цифр, если он должен быть представлен в едином формате IEEE.

Аналогично, разница между значением 1,3, присвоенным z, и напечатанным значением составляет 0,00000004768, то есть восемь десятичных порядков меньше, чем z . Точность представления z в едином формате IEEE составляет от 7 до 8 значащих цифр, или что z имеет около семи значащих цифр, если это необходимо. быть представлено в едином формате IEEE.

Теперь сформулируйте вопрос:

Предположим, вы конвертируете десятичное число с плавающей запятой a в его двоичное представление единого формата IEEE b , а затем перевести b обратно в десятичное число c; сколько порядков между a и a - c?

Перефразируйте вопрос:

каково количество значащих десятичных цифр a в представлении единого формата IEEE или сколько десятичных цифр должно быть доверять как точную, когда кто-то представляет x в едином формате IEEE?

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

Наоборот, если вы преобразуете двоичное число в одинарном формате IEEE в десятичное число, а затем преобразуете его обратно в двоичное, как правило, вам нужно использовать не менее 9 десятичных цифр, чтобы гарантировать, что после этих двух преобразований вы получаете номер, с которого начали.

Полная картина представлена ​​в ТАБЛИЦЕ 2-10:

ТАБЛИЦА 2-10 Диапазон и точность форматов хранения

Базовое преобразование в среде Solaris

  • Преобразование основания из 10 в основание 2 происходит при чтении числа в обычной десятичной системе счисления и сохранении его во внутреннем двоичном формате.
  • Преобразование по основанию 2 в основание 10 происходит при печати внутреннего двоичного значения в виде строки десятичных цифр ASCII.

Недополнение

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

Пороги недополнения

В ТАБЛИЦЕ 2-11 показаны пороговые значения потери значимости для одинарной, двойной и двойной расширенной точности.

ТАБЛИЦА 2-11 Пороговые значения потери значимости

Как арифметика IEEE обрабатывает недополнение?

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

Почему постепенный недорасход?

Цель субнормальных чисел состоит не в том, чтобы полностью избежать недополнения/переполнения, как это делают некоторые другие арифметические модели. Скорее, субнормальные числа устраняют потерю значимости как повод для беспокойства при различных вычислениях (как правило, умножение с последующим сложением). Более подробное обсуждение см. в статьях Джеймса Деммеля Underflow and the Reliability of Numerical Software и Борьба с эффектами недополнения и переполнения при определении действительных корней многочленов С. Линнайнмаа.

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

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

Свойства ошибки постепенного потери значимости

В большинстве случаев результаты с плавающей запятой округляются:

вычисленный результат = истинный результат + округление

Насколько большим может быть округление? Одна удобная мера его размера называется последняя единица, сокращенно ulp. Младший значащий бит дроби числа с плавающей запятой в его стандартном представлении — это его последнее место. Значение, представленное этим битом (например, абсолютная разница между двумя числами, представление которых идентично, за исключением этого бита), является единицей на последнем месте этого числа. Если вычисляемый результат получается путем округления истинного результата до ближайшего представимого числа, то очевидно, что ошибка округления не превышает половины единицы в последнем разряде вычисляемого результата. Другими словами, в арифметике IEEE с режимом округления до ближайшего,

0 |округление| 1/2 ulp

вычисленного результата.

Обратите внимание, что ulp — это относительное количество. ulp очень большого числа сам по себе очень большой, а ulp маленького числа сам по себе крошечный. Это отношение можно сделать явным, выразив ulp как функцию: ulp(x) обозначает единицу в последнем разряде числа с плавающей запятой x.

Кроме того, ulp числа с плавающей запятой зависит от точности, с которой это число представлено. Например, в ТАБЛИЦЕ 2-12 показаны значения ulp(1) в каждом из четырех описанных выше форматов с плавающей запятой:

ТАБЛИЦА 2-12 ulp(1) в четырех различных значениях точности

  • xyx - y 0
  • ( x - y ) + yx , с точностью до ошибки округления в большем из x и г
  • 1/(1/ x ) x, когда x — нормализованное число, подразумевающее 1/ x 0

Два примера постепенного недополнения по сравнению с магазином 0

  • Решение линейных уравнений
  • Решение полиномиального уравнения
  • Числовое интегрирование
  • Ускорение конвергенции
  • Сложное деление

Имеет ли значение недополнение?

Несмотря на эти примеры, можно утверждать, что недозаполнение редко имеет значение, так что зачем беспокоиться? Однако этот аргумент обращается сам на себя.

При отсутствии постепенного опустошения пользовательские программы должны быть чувствительны к неявному порогу неточности. Например, в одинарной точности, если в некоторых частях вычислений происходит потеря значимости, а Store 0 используется для замены результатов с потерей значимости на 0 , тогда точность может быть гарантирована только до 10 -31 , а не 10 -38 , обычного нижнего диапазона. для показателей с одинарной точностью.

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

p>

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

Читайте также: